2013-07-16 80 views
3

我有一个带有三列的表格文本文件中的数据。我使用np.genfromtxt将所有列读入matplotlib中,作为x,y,z。matplotlib来自x,y,z数据的pcolormesh图

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

我的猜测是x,y和z会被看作是长度相同的一维向量,比如说N.问题是当你创建你的xmeshymesh时,它们是N×N,你的z值也应该如此。这只是N,这就是为什么你会得到一个错误。

你的文件的布局是什么?我猜测每一行都是你想要创建网格的(x,y,z)。为了做到这一点,你需要知道这些点是如何作为一个网格来排序的(无论是主要的还是主要的)。一旦你知道了这一点,而不是创建xmeshymesh,你可以做这样的事情:

scatter(x, y, c=z) 

,这将给你几点:

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) 

在此之前,我会做这个启动的网格,这是一个很好的起点。

0

看来你是作为二维数组绘制X和Y,而Z仍然是一维数组。尝试是这样的:

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

更新:头具有4×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拉尔森和我重塑数组作为suggestet这样的:

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

我尝试这样做,得到了错误:ValueError异常:新阵列的总大小必须保持不变 –

+0

重整的阵列必须具备的元素和原阵列的总数相同。尝试写出数组的大小以确保重构后的数组与原始数组相同(在从文件中读取数据之后,但在重新塑形之前):“print x.shape,y.shape,z.shape” 。 –

1

我有同样的问题,并与古斯塔夫·拉尔森的建议,同意使用

scatter(x, y, c=z) 

在我的具体情况,我设置了散点的线宽为零:

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

,你可以玩其他装饰品,配色方案等,matplotlib.pyplot.scatter的参考将进一步帮助你。

3

在上面提供的示例数据中,x,y和z可以很容易地重新整形以获得二维数组。下面的答案适用于寻找随机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() 

three_1D_arrays_2D_plot

相关问题