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

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

在我的例子中,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兼容的结构?谢谢

python plot 3d geometry-surface
1个回答
2
投票

这是基本的 3D 曲面绘制程序。看来你的

X
Y
只是一维数组。然而,
X
Y
Z
必须是相同形状的二维数组。
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()
© www.soinside.com 2019 - 2024. All rights reserved.