Python - Matplotlib 3D输入格式化Z(依赖)值

3

我有一个问题与这个问题相似,但它只解决了部分问题(最初的问题是.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]是一个二维数组,(data是一个二维数组的列表)。positions是一个行向量和列向量的元组,所以第3行本质上是将positions重构为两个行向量,并且制作两个矩阵,一个用于X值,一个用于Y值,因为我相信Axes3D.plot_surface()需要这样做。

我的问题是,即使Z是一个二维数组,.plot_surface()仍然不承认它是这种形式。

编辑:我刚刚证实了使用以下代码的正确形状:

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.plot_surface()"代替"Axes3D.plotsurface()"。我不知道为什么这个更改使其起作用,所以请帮助我弄清楚。


这有点沿着正确的方向:https://dev59.com/pWox5IYBdhLWcg3wf0Xl?rq=1 - Liam Clink
但问题是我已经先前生成了这个数组。我可以稍后像这样重写它,但那不是我现在需要的。我不明白为什么它不能按原样绘制。 - Liam Clink
1
我也遇到了这个问题 - 文档似乎表明你可以像这样使用它,但实际上你根本不能。如果你这样做Axes3D.plot_surface(X=X,Y=Y,Z=Z),你会发现缺少self。这似乎是版本1.0.0的变化,让文档有些混乱。 - OJFord
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)

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