2012-11-04 249 views
4
二维数组

所以我有一个二维数组(名为Data),看起来像:绘制与Matplotlib

  Shape 0  Shape 1  ...  Shape N 
      -------  -------    ------- 

Scale 0 | Value00 , Value01  ...  Value0N | 

Scale 1 | Value10 , Value11  ...  Value1N | 

    . 
    . 
    . 

Scale N | ValueN0 , ValueN1  ...  ValueNN | 

我想创建一个三维图,其中ValueXXs是Z轴。我尝试了两次尝试,但每次都会给我一个相对于另一个旋转的表面,所以我感到有点困惑。这是我在一个解决方案1的尝试:

x,y = numpy.mgrid[0:50:50j,0:50:50j] 
f = Data 
fig = plt.figure() 
ax = Axes3D(fig) 
ax.plot_surface(x,y,f,rstride=1,cstride=1) 

这里是我的第二次尝试:

nx, ny = 50, 50 
x = range(nx) 
y = range(ny) 
hf = plt.figure() 
ha = hf.add_subplot(111, projection='3d') 
X, Y = numpy.meshgrid(x, y) 
ha.plot_surface(X,Y,Data,rstride=1,cstride=1) 

检查X和Y确实没有任何帮助真的是因为它是一个正方形。我不确定何时X代表我的'比例',而不是代表我的'形状'。

那么,这两个例子到底发生了什么?有没有更好的方法来绘制这个数组?

谢谢!

+0

我发现当我有这样的情况下,它通常是最容易故意产生具有不同的x和y轴的尺寸的测试数据集。这将使您能够检查绘图,并且在某些情况下(例如,pcolor),如果您错误地指定了x和y轴阵列,它将引发错误。 – DaveP

回答

1

如果我理解你说得对,混淆是哪个轴是哪个,对吧?如果是这种情况,你可以很容易地绘制一个已知的不对称形状,情节会告诉你一切。例如,采用an example from the gallery

# By Armin Moser 

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib 
import numpy as np 
from matplotlib import cm 
from matplotlib import pyplot as plt 
step = 0.04 
maxval = 1.0 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

# create supporting points in polar coordinates 
r = np.linspace(0,1.25,50) 
p = np.linspace(0,2*np.pi,50) 
R,P = np.meshgrid(r,p) 
# transform them to cartesian system 
X,Y = R*np.cos(P),R*np.sin(P) 

#Z = ((R**2 - 1)**2) 
Z = (X**2 + 0.2*Y**2 -1)**2 # <------- edit 

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet) 
#ax.set_zlim3d(0, 1) 
ax.set_xlabel(r'$\phi_\mathrm{real}$') 
ax.set_ylabel(r'$\phi_\mathrm{im}$') 
ax.set_zlabel(r'$V(\phi)$') 
plt.show() 
+0

那么,基本上我想知道这两种方法的行为差异。 我盯着情节一会儿,发现一条网格线有一个独特的形状。通过绘制它,我能够区分方法1的作用。 基本上,我的方法1从字面上绘制了我想要的数组。行对应于X轴,列对应于Y轴。 如果任何人都可以给出两种方法行为的更详细的答案,这对我和其他人会有很大的帮助。 谢谢! –