matplotlib 如何绘制3D多边形

xeufq47z  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(264)

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

什么?我该怎么解决?

t5zmwmid

t5zmwmid1#

我也遇到过类似的拉链问题。我支持这个论点,它是一个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), zdir='z')
plt.show()

我做了两个改变:
1.替换行:from matplotlib.collections import Poly3DCollection通过:from matplotlib.mplot3.art3d import Poly3DCollection
我不知道你的import语句是从哪里来的,但它似乎不适合我
1.改了行:verts = list(zip(x,y,z))verts = [list(zip(x, y, z))]
不知何故,后者似乎起作用了。我刚刚开始使用python,我不能提供一个铁一般的解释。然而,这里什么也没有发生:类Poly 3DCollection需要“集合”作为第一输入参数,因此需要列表的列表。在这种情况下,仅给出列表,其被假定因此错过了一个级别。通过添加另一个级别(通过[。..])它起作用了。
我不知道这个解释是否有意义,但它符合我的直觉;)
这些修改似乎是有效的,因为这段代码创建了所需的3D多边形(我注意到,因为这是我的第一篇文章,我不允许发布一个布丁证明图。(……)
希望这是有用,
亲切的问候

zmeyuzjn

zmeyuzjn2#

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

cwtwac6a

cwtwac6a3#

下面是一个当前的解决方案,如果你得到错误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()

相关问题