簡體   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