在Python 3中绘制3D多边形

时间:2016-06-02 07:29:24

标签: python matplotlib mplot3d

在我以某种方式获得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

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

2 个答案:

答案 0 :(得分:5)

我在拉链方面遇到了类似的问题。我支持这个论文,它是一个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

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

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

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

    我不知道这个解释是否有意义,但它直观地适合我;)

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

    希望这很有用,

    亲切的问候

答案 1 :(得分:1)

您必须使用 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()

enter image description here