当Z是Python中的列表列表时,如何用X,Y,Z绘制3D表面?

时间:2014-05-22 18:54:04

标签: python plot 3d geometry-surface

在我的情况下,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 个答案:

答案 0 :(得分:2)

这是一个基本的3D表面绘图程序。您的XY似乎只是一维数组。但是,XYZ必须是相同形状的2D数组。 numpy.meshgrid函数对于从两个1D数组创建2D网格非常有用。

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