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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python - Matplotlib 3D输入格式化Z(从属)值相关的知识,希望对你有一定的参考价值。

我有一个问题非常类似于这个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()”。我不知道为什么这个改变让它发挥作用,所以请仍然帮我解决这个问题。

答案

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

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

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

Axes3D.plot_surface(ax, X, Y, Z)

以上是关于python - Matplotlib 3D输入格式化Z(从属)值的主要内容,如果未能解决你的问题,请参考以下文章

Python 使用 matplotlib绘制3D图形

Python矩阵作图库matplotlib的初级使用

如何使用 python/matplotlib 为 3d 绘图设置“相机位置”?

使用 Python matplotlib 绘制 3d 矢量

Python-Matplotlib可视化(10)——一文详解3D统计图的绘制

Python 和 Matplotlib:在 Jupyter Notebook 中制作交互式 3D 绘图