4

我在表格形式的文本文件中有三列数据。我使用 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

这要怎么解决。

4

4 回答 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()

在此处输入图像描述

于 2015-11-18T00:24:02.647 回答
4

我的猜测是 x、y 和 z 将被读取为相同长度的一维向量,假设为 N。问题是当您创建xmeshand时ymesh,它们是 N x N,您的 z 值也应该是. 只有 N,这就是您收到错误的原因。

你的文件的布局是什么?我猜每一行都是一个 (x,y,z) ,你想从中创建一个网格。为了做到这一点,您需要知道点是如何作为网格排序的(作为行优先或列优先)。一旦你知道这一点,而不是创建xmeshand 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)

在这样做之前,我会先这样做:

scatter(x, y, c=z)

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

于 2013-07-16T04:02:15.147 回答
1

我有同样的问题,并同意 Gustav Larsson 的建议使用

scatter(x, y, c=z)

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

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

当然,你也可以玩弄其他的装饰、配色方案等,参考matplotlib.pyplot.scatter会帮助你更进一步。

于 2013-07-23T21:16:49.057 回答
0

似乎您将 X 和 Y 绘制为二维数组,而 Z 仍然是一维数组。尝试类似:

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

更新: Tou 有一个大小为 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) 
于 2013-07-16T04:02:49.287 回答