从x、y、z数据绘制matplotlib pcolormesh图。

4

我有一个包含三列数据的表格形式的文本文件。 我使用np.genfromtxt将所有列读入matplotlib作为x,y,z。

我想创建一个颜色网格图,其中x和y是坐标,z代表颜色,我认为人们将这样的图称为热力图。

我的代码如下:

x = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (0))
y = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (1))
z = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (2))

xmesh, ymesh = np.meshgrid(x,y)
diagram1.pcolormesh(xmesh,ymesh,z)   

但是我收到了以下错误信息:
line 7154, in pcolormesh
C = ma.ravel(C[0:Ny-1, 0:Nx-1]) # data point in each cell is value at
IndexError: too many indices

文本文件如下:
1 1 5
2 1 4
3 1 2
4 1 6
1 2 6
2 2 2
3 2 1
4 2 9
1 3 7
2 3 4
3 3 3
4 3 5
1 4 3
2 4 4
3 4 7
4 4 6

这个问题该如何解决?
4个回答

7
在上面提供的示例数据中,可以轻松地将x、y和z重塑为2D数组。以下答案适用于寻求具有随机x、y和z数组更一般化答案的人。
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
import numpy

# use your x,y and z arrays here
x = numpy.random.randint(1,30, 50)
y = numpy.random.randint(1,30, 50)
z = numpy.random.randint(1,30, 50)

yy, xx = numpy.meshgrid(y,x)
zz = griddata(x,y,z,xx,yy, interp='linear')
plt.pcolor(zz)
#plt.contourf(xx,yy,zz) # if you want contour plot
#plt.imshow(zz)
plt.pcolorbar()
plt.show()

enter image description here


1
似乎from matplotlib.mlab import griddata不再起作用了,而在scipy.interpolate中,griddata已被替换为不同的语法。是否可能更新这个有用的答案? - Aerinmund Fagelson
cannot import name 'griddata' from 'matplotlib.mlab' - ru111

4
我的猜测是,x、y和z将被读取为相同长度的一维向量,假设长度为N。问题在于,当你创建xmeshymesh时,它们是N x N,而你的z值也应该是N x N。但实际上只有N,这就是为什么会出现错误的原因。
你的文件布局是怎样的呢?我猜每一行都是一个(x,y,z)三元组,你想从中创建一个网格。为了做到这一点,你需要知道点是如何以网格形式排序的(按行主序或列主序)。一旦你知道了这个,就可以像这样操作,而不是创建xmeshymesh
N = np.sqrt(len(x)) # Only if squared, adjust accordingly
x = x.reshape((N, N))
y = y.reshape((N, N))
z = z.reshape((N, N))
pcolormesh(x, y, z)

在进行此操作之前,我建议先执行以下步骤:
scatter(x, y, c=z)

这将提供给您网格点的位置,这是一个很好的起点。


1

我遇到了同样的问题,并且同意Gustav Larsson的建议使用

scatter(x, y, c=z)

在我的特定情况下,我将散点的linewidths设为零:

scatter(x, y, c=z, linewidths=0)

当然,您可以尝试其他装饰、颜色方案等,matplotlib.pyplot.scatter 的参考资料会进一步帮助您。

0

看起来你正在将X和Y作为二维数组进行绘图,而Z仍然是一个一维数组。尝试类似这样的方法:

Znew=np.reshape(z,(len(xmesh[:,0]),len(xmesh[0,:])))
diagram1.pcolormesh(xmesh,ymesh,Znew) 

更新: 你有一个大小为4x4的X/Y网格:

x = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (0))
y = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (1))
z = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (2))

按照 @Gustav Larsson 和我建议的方式重新整形数组,像这样:

Xnew=np.reshape(x,(4,4)) 
Xnew=np.reshape(y,(4,4))
Znew=np.reshape(z,(4,4))

这将给你三个4x4数组,可以使用pcolormesh来绘制:

diagram1.pcolormesh(Xnew,Ynew,Znew) 

我尝试了这个操作,但得到了错误信息:ValueError: 新数组的总大小必须保持不变。 - Paul Eigenthaler
重新塑造的数组必须具有与原始数组相同的元素总数。尝试写出数组的大小,以确保在重新塑造之后,您的数组与原始数组相同(在从文件读取数据之后,但在重新塑造之前):“print x.shape,y.shape,z.shape”。 - Trond Kristiansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接