python - Matplotlib 3D输入格式化Z(从属)值

问题描述 投票:3回答:1

我有一个问题非常类似于这个Matplotlib 3D plot - 2D format for input data?,但它只是部分解决了我的问题(最初是.plot_surface()没有识别任何参数)。我想要做的是绘制2个参数的函数,这就是我所拥有的:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X,Y = np.meshgrid(positions[0],np.transpose(positions[1]))
Z = data[0]
Axes3D.plot_surface(X, Y, Z)

这引发了这个错误:

TypeError: plot_surface() missing 1 required positional argument: 'Z'

data [0]是2D数组。 (数据是2D数组的列表)。 position是行向量和列向量的元组,因此第3行基本上将位置重建为两个行向量,然后使两个矩阵一个用于X,一个用于Y值,因为我相信Axes3D.plot_surface()需要。

我的问题是,即使Z是2D数组,.plot_surface()也拒绝识别它。

编辑:我刚用这个确认Z确实是正确的形状:

if Z.shape == X.shape:
    print('Same shape')
    Axes3D.plot_surface(X, Y, Z)

所以我不知道它为什么不起作用。即使我像这样使用X代表Z(因为它没有抱怨X缺失或形状错误),它仍然会生气。

Axes3D.plot_surface(X, Y, X)

编辑:在查看示例并尝试解决问题时,我终于开始工作了。我几乎不认为这解决了,因为我仍然不知道为什么一种方式有效而另一种方式无效,我不想留下未解决的后代。通过这样做,我得到了它的工作

surf = ax.plot_surface(X, Y, Z)

而不是“Axes3D.plotsurface()”。我不知道为什么这个改变让它发挥作用,所以请仍然帮我解决这个问题。

arrays python-3.x multidimensional-array matplotlib 3d
1个回答
3
投票

如你所说,似乎正确的方法是通过轴对象(下面的代码中的ax):

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z)

或者,你仍然可以使用Axes3D调用它,但是你需要将它传递给轴对象ax,如下所示:

Axes3D.plot_surface(ax, X, Y, Z)
© www.soinside.com 2019 - 2024. All rights reserved.