使用plot_wireframe绘制立方体报错:'list' object has no attribute 'ndim'
解决3D线框绘制错误的方案
错误原因
ax.plot_wireframe()对输入数据有两个硬性要求:
- 必须是numpy数组(而非Python普通列表)
- 必须是2维结构(线框需要网格状数据生成曲面的行和列)
你当前的X/Y/Z是1维Python列表,既没有numpy数组的ndim属性,也不符合2维数据要求,因此触发错误。
两种可行解决方案
方案1:构造2D网格数据,使用plot_wireframe
通过生成立方体各面的网格数据,满足plot_wireframe的输入要求:
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 定义立方体的顶点取值 x = np.array([0, 1]) y = np.array([0, 1]) # 绘制底面(z=0) X_bottom, Y_bottom = np.meshgrid(x, y) Z_bottom = np.zeros_like(X_bottom) ax.plot_wireframe(X_bottom, Y_bottom, Z_bottom) # 绘制顶面(z=1) X_top, Y_top = np.meshgrid(x, y) Z_top = np.ones_like(X_top) ax.plot_wireframe(X_top, Y_top, Z_top) # 绘制前面(y=0) X_front, Z_front = np.meshgrid(x, [0,1]) Y_front = np.zeros_like(X_front) ax.plot_wireframe(X_front, Y_front, Z_front) # 绘制后面(y=1) X_back, Z_back = np.meshgrid(x, [0,1]) Y_back = np.ones_like(X_back) ax.plot_wireframe(X_back, Y_back, Z_back) # 绘制左面(x=0) Y_left, Z_left = np.meshgrid(y, [0,1]) X_left = np.zeros_like(Y_left) ax.plot_wireframe(X_left, Y_left, Z_left) # 绘制右面(x=1) Y_right, Z_right = np.meshgrid(y, [0,1]) X_right = np.ones_like(Y_right) ax.plot_wireframe(X_right, Y_right, Z_right) plt.show()
方案2:基于现有顶点,用plot3D绘制边
直接利用你已有的8个顶点,定义立方体的12条边后逐个绘制,逻辑更直观:
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 原有的8个立方体顶点 X = [0, 1, 1, 0, 0, 1, 1, 0] Y = [0, 0, 1, 1, 0, 0, 1, 1] Z = [0, 0, 0, 0, 1, 1, 1, 1] # 定义立方体的12条边(每个元素是两个顶点的索引) edges = [ (0,1), (1,2), (2,3), (3,0), # 底面边 (4,5), (5,6), (6,7), (7,4), # 顶面边 (0,4), (1,5), (2,6), (3,7) # 垂直边 ] # 循环绘制每条边 for i, j in edges: ax.plot3D([X[i], X[j]], [Y[i], Y[j]], [Z[i], Z[j]], 'blue') # 添加坐标轴标签(可选) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()
方案对比
- 方案1贴合
plot_wireframe的设计逻辑,适合绘制曲面类线框 - 方案2直接复用你现有的顶点数据,代码更简洁,适合绘制多面体框架
内容的提问来源于stack exchange,提问作者Alpha Autidore
相关产品推荐
相关产品推荐

