如何用列表生成的Z绘制X、Y、Z的3D曲面

1 投票
1 回答
2079 浏览
提问于 2025-04-18 07:20

在我的例子中,X是从0到100的范围,Y是从0到10的范围,而Z是一个列表的列表。Z的长度和X一样,都是100,而Z里面的每个元素列表的长度和Y是一样的。

Z = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ..., [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]].

我有以下代码,但它不工作,报错两个或多个数组在轴1上的维度不兼容。

fig = plt.figure(figsize=(200, 6))
ax = fig.add_subplot(1, 2, 1, projection='3d')
ax.set_xticklabels(x_ax)
ax.set_yticklabels(y_ax)
ax.set_title("my title of chart")

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)

ax.set_zlim(0, 100)

fig.colorbar(surf, shrink = 0.5, aspect = 5)
plt.show()

我猜这个错误是因为Z的数据结构有问题,我该如何让它和X、Y的结构兼容呢?谢谢。

1 个回答

2

这里有一个基本的3D表面绘制的步骤。看起来你的XY只是1维数组。但是,XYZ必须是形状相同的2维数组。numpy.meshgrid这个函数很有用,可以从两个1维数组创建出2维网格。

import matplotlib.pyplot as plt
from  matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.array(np.linspace(-2,2,100))
y = np.array(np.linspace(-2,2,10))
X,Y = np.meshgrid(x,y)

Z = X * np.exp(-X**2 - Y**2);

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
fig.colorbar(surf, shrink = 0.5, aspect = 5)

plt.show()

撰写回答