我是Python初学者。
我有一个X值列表
x_list = [-1,2,10,3]
我有一个Y值列表
y_list = [3,-3,4,7]
然后,我每对夫妇都有一个Z值。从原理上讲,这是这样的:
X Y Z
-1 3 5
2 -3 1
10 4 2.5
3 7 4.5
Z值存储在
z_list = [5,1,2.5,4.5]
中。我需要获得一个二维图,其中X轴上的X值,Y轴上的Y值,以及每对Z值(由强度图表示)。
这是我尝试过的,但未成功:
X, Y = np.meshgrid(x_list, y_list)
fig, ax = plt.subplots()
extent = [x_list.min(), x_list.max(), y_list.min(), y_list.max()]
im=plt.imshow(z_list, extent=extent, aspect = 'auto')
plt.colorbar(im)
plt.show()
如何正确地做到这一点?
最佳答案
问题在于imshow(z_list, ...)
将期望z_list
为(n,m)
类型的数组,基本上是一个值网格。要使用imshow功能,每个网格点都需要具有Z值,这可以通过收集更多数据或进行插值来实现。
这是一个将数据与线性插值一起使用的示例:
from scipy.interpolate import interp2d
# f will be a function with two arguments (x and y coordinates),
# but those can be array_like structures too, in which case the
# result will be a matrix representing the values in the grid
# specified by those arguments
f = interp2d(x_list,y_list,z_list,kind="linear")
x_coords = np.arange(min(x_list),max(x_list)+1)
y_coords = np.arange(min(y_list),max(y_list)+1)
Z = f(x_coords,y_coords)
fig = plt.imshow(Z,
extent=[min(x_list),max(x_list),min(y_list),max(y_list)],
origin="lower")
# Show the positions of the sample points, just to have some reference
fig.axes.set_autoscale_on(False)
plt.scatter(x_list,y_list,400,facecolors='none')
您可以看到它在您的采样点上显示了正确的值(由
x_list
和y_list
指定,由半圆显示),但是由于插值的性质和采样点的数量少,它在其他位置的变化更大。