使用Matplotlib绘制二维数组的图表

4

我有一个二维数组(名为Data),它看起来像:

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

Scale 0  |  Value00   ,   Value01     ...      Value0N |

Scale 1  |  Value10   ,   Value11     ...      Value1N |

  .
  .
  .

Scale N  |  ValueN0   ,   ValueN1     ...      ValueNN |

我想创建一个三维图形,其中ValueXX是Z轴。我尝试了两种方法,但每种方法都给我一个与另一个旋转的表面,所以我有点困惑。这是我第一次尝试解决问题:

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代表我的“比例”时,它是否表示我的“形状”。

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

谢谢!


我发现当我遇到这种情况时,最简单的方法通常是有意地生成一个具有不同x和y轴大小的测试数据集。这将使您能够检查绘图,并且在某些情况下(例如pcolor),如果您错误地获取了x和y轴数组,则会引发错误。 - DaveP
1个回答

1

如果我理解正确,您的困惑是哪个轴是哪个轴,对吗? 如果是这种情况,您可以轻松地绘制一个已知的不对称形状,图表将告诉您一切。例如,采用画廊中的示例

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

基本上,我想知道这两种方法的行为差异。我盯着图表看了一会儿,发现有一条网格线具有独特的形状。通过绘制它,我能够区分出方法1的作用。基本上,我的方法1按照我想要的方式直接绘制了我的数组。行对应于X轴,列对应于Y轴。如果有人能够给出更详细的答案来解释这两种方法的行为,那对我和其他人都将是一个很大的帮助。谢谢! - The Dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接