Skip to main content
 首页 » 编程设计

python之在 Python 3 中绘制 3D 多边形

2025年05月04日17oomusou

在我寻求以某种方式实际绘制 3D 多边形时,我遇到了以下脚本(编辑:稍作修改):Plotting 3D Polygons in python-matplotlib

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.collections import Poly3DCollection 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = Axes3D(fig) 
x = [0,1,1,0] 
y = [0,0,1,1] 
z = [0,1,0,1] 
verts = [zip(x, y,z)] 
ax.add_collection3d(Poly3DCollection(verts),zs=z) 
plt.show() 

但是当我运行它时,我收到以下错误消息:

TypeError: object of type 'zip' has no len() 

这似乎是 Python 2 与 3 的对比,因为我在 Python 3 中运行,而且该帖子已有五年历史。所以我将倒数第三行更改为:

verts = list(zip(x, y, z)) 

现在 verts 出现在变量列表中,但我仍然收到错误:

TypeError: zip argument #1 must support iteration 

什么?我该如何解决这个问题?

请您参考如下方法:

我在压缩方面遇到了类似的问题。我支持这个论点,它是 python 2.x 与 3.x 的对比。

但是,我找到了一个显然可行的地方:

from mpl_toolkits.mplot3d import Axes3D 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 
import matplotlib.pyplot as plt 
 
fig = plt.figure() 
ax = Axes3D(fig) 
x = [0, 1, 1, 0] 
y = [0, 0, 1, 1] 
z = [0, 1, 0, 1] 
verts = [list(zip(x, y, z))] 
print(verts) 
ax.add_collection3d(Poly3DCollection(verts), zdir='z') 
plt.show() 

因此我做了两个改变:

  1. 替换行: 从 matplotlib.collections 导入 Poly3DCollection 经过: 从 matplotlib.mplot3.art3d 导入 Poly3DCollection。

    我不知道你的导入语句来自哪里,但它似乎对我不起作用

  2. 将行:verts = list(zip(x,y,z)) 更改为 verts = [list(zip(x, y, z))]

不知何故,后者似乎有效。刚开始使用 python,我无法提供铁定的解释。然而,这里什么也没有:Poly3DCollection 类需要一个“集合”作为第一个输入参数,因此是一个列表列表。在这种情况下,只给出列表,假定它错过了一个级别。通过向其添加另一个级别(通过 [...]),它起作用了。

我不知道这个解释是否合理,但它符合我的直觉 ;)

这些修改似乎有效,因为此代码创建了所需的 3D 多边形(我注意到,因为这是我的第一篇文章,所以不允许我发布布丁证明图...... )

希望有用,

亲切的问候