来自 x、y、z 值的 matplotlib 2D 图
Posted
技术标签:
【中文标题】来自 x、y、z 值的 matplotlib 2D 图【英文标题】:matplotlib 2D plot from x,y,z values 【发布时间】:2017-02-05 05:25:12 【问题描述】:我是 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]
中。
我需要得到一个 2D 图,其中 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()
如何正确完成这项工作?
【问题讨论】:
【参考方案1】:问题是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
指定,由半圆表示),但由于插值的性质,它在其他地方的变化要大得多和少量的样本点。
【讨论】:
【参考方案2】:这是一种方法:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LogNorm
x_list = np.array([-1,2,10,3])
y_list = np.array([3,-3,4,7])
z_list = np.array([5,1,2.5,4.5])
N = int(len(z_list)**.5)
z = z_list.reshape(N, N)
plt.imshow(z, extent=(np.amin(x_list), np.amax(x_list), np.amin(y_list), np.amax(y_list)), norm=LogNorm(), aspect = 'auto')
plt.colorbar()
plt.show()
我点击了这个链接:How to plot a density map in python?
【讨论】:
以上是关于来自 x、y、z 值的 matplotlib 2D 图的主要内容,如果未能解决你的问题,请参考以下文章