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

matplotlib pcolormesh从x、y、z数据绘制,matplotlib,Matplotlib,我在一个文本文件中有三列的表格格式的数据。我使用np.genfromtxt将所有列作为x、y、z读入matplotlib 我想创建一个颜色网格图,其中x和y是坐标,z代表颜色,我想人们把这种图称为热图 我的代码如下: x = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (0)) y = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols =

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

我想创建一个颜色网格图,其中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

这是如何解决的。

我的猜测是,x、y和z将被读取为相同长度的一维向量,比如N。问题是,当您创建
xmesh
ymesh
时,它们是nxn,您的z值也应该是nxn。只有N,这就是为什么会出现错误

您的文件的布局是什么?我猜每一行都是一个(x,y,z),您希望从中创建网格。为此,您需要知道点是如何作为网格排序的(作为行主网格还是列主网格)。一旦您知道了这一点,就可以执行以下操作,而不是创建
xmesh
ymesh

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)
Xnew=np.reshape(x,(4,4)) 
Xnew=np.reshape(y,(4,4))
Znew=np.reshape(z,(4,4))
在执行此操作之前,我将首先执行以下操作:

scatter(x, y, c=z)

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

似乎您正在将X和Y绘制为二维阵列,而Z仍然是一维阵列。尝试以下方法:

Znew=np.reshape(z,(len(xmesh[:,0]),len(xmesh[0,:])))
diagram1.pcolormesh(xmesh,ymesh,Znew) 
更新:您的X/Y网格大小为4x4:

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和我的建议,对阵列进行如下重塑:

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)
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) 

我也有同样的问题,同意古斯塔夫·拉尔森的建议

scatter(x, y, c=z)
在我的特殊情况下,我将散射点的线宽设置为零:

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

当然,您可以使用其他装饰、配色方案等,的参考将进一步帮助您。

在上面提供的示例数据中,可以轻松地对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()

我尝试了这一点,但得到了错误:ValueError:新数组的总大小必须保持不变重塑后的数组的元素总数必须与原始数组的元素总数相同。尝试写出数组的大小,以确保重新整形后的数组与原始数组相同(从文件中读取数据后,但在重新整形之前):“打印x.shape、y.shape、z.shape”。