matplotlib 来自x,y,z数据的pcolormesh图

x33g5p2x  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(172)

我在一个有三列的表格文本文件中有数据,我使用np.genfromtxt将所有列作为x,y,z读入matplotlib。
我想创建一个彩色meshplot,其中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

该文本文件如下:
这是怎么解决的。

i86rm4rw

i86rm4rw1#

在上面提供的示例数据中,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()

mwkjh3gx

mwkjh3gx2#

我的猜测是x,y和z将被读取为相同长度的一维向量,假设N。问题是,当你创建xmeshymesh时,它们是N x N,你的z值也应该是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)

这将给你给予网格的点,这是一个很好的起点。

50pmv0ei

50pmv0ei3#

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

scatter(x, y, c=z)

在我的特殊情况下,我将散射点的线宽设置为零:

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

当然,你也可以尝试其他的装饰,配色方案等,matplotlib.pyplot.scatter的参考会对你有更大的帮助。

cgfeq70w

cgfeq70w4#

看起来你把X和Y绘制成2D数组,而Z仍然是1D数组。尝试如下操作:

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

**更新:**图中有一个大小为4x 4的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))

这给了你三个4x 4的数组来使用pcolormesh绘图:

diagram1.pcolormesh(Xnew,Ynew,Znew)

相关问题