繁体   English   中英

在 Python 3 中绘制 3D 多边形

[英]Plotting 3D Polygons in Python 3

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

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 vs 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), zs='z')
plt.show()

因此,我进行了两项更改:

  1. 将行: from matplotlib.collections import Poly3DCollection为: from matplotlib.mplot3.art3d import Poly3DCollection

    我不知道您的导入语句来自何处,但它似乎对我不起作用

  2. 更改了这一行: verts = list(zip(x,y,z))verts = [list(zip(x, y, z))]

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

我不知道这种解释是否合理,但是直觉上适合我;)

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

希望这是有用的,

亲切的问候

您必须使用Poly3DCollection而不是PolyCollection:

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 = [zip(x,y,z)]
ax.add_collection3d(Poly3DCollection(verts), zs=z)
plt.show()

在此处输入图片说明

这是当前的解决方案,以防您收到错误ValueError: not enough values to unpack (expected 3, got 1) ,这是由于在其他解决方案中构建verts的方式:

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 = [[xx,yy,zz] for xx,yy,zz in zip(x,y,z)]     # NEW
ax.add_collection3d(Poly3DCollection(verts))
plt.show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM