Tracer des polygones 3D en Python 3
dans ma quête pour obtenir d'une manière ou d'une autre que des polygones 3D tracent réellement, je suis tombé sur le script suivant (modifier légèrement): traquer des polygones 3D en 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()
mais quand j'exécute cela, je reçois le message d'erreur suivant:
TypeError: object of type 'zip' has no len()
il semble que ce soit une chose de Python 2 contre 3, car je cours en Python 3, et ce post a cinq ans. Alors j'ai changé la dernière ligne en:
verts = list(zip(x, y, z))
maintenant les verts apparaissent dans la liste des variables, mais j'obtiens toujours une erreur:
TypeError: zip argument #1 must support iteration
quoi? Comment puis-je résoudre ce problème?
2 réponses
j'ai eu un problème similaire avec le zip. Je soutiens la thèse c'est un python 2.x vs 3.x Machin.
cependant, j'ai trouvé quelque part qui fonctionne apparemment:
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()
j'ai donc fait deux changements:
-
a remplacé la ligne:
from matplotlib.collections import Poly3DCollection
par:from matplotlib.mplot3.art3d import Poly3DCollection
.Je ne sais pas d'où vient votre déclaration d'importation, mais ça n'a pas l'air de marcher pour moi.
-
a changé la ligne:
verts = list(zip(x,y,z))
enverts = [list(zip(x, y, z))]
D'une façon ou d'une autre, ce dernier semble fonctionner. Ayant moi-même commencé avec python, Je ne peux pas vous offrir une explication toute en fer. Cependant, rien ne va plus: la classe Poly3DCollection requiert comme premier paramètre d'entrée une "collection", donc une liste de listes. Dans ce cas, seule la liste est donnée, ce qui suppose donc raté un niveau. En ajoutant un autre niveau (via le bouton [...]), il a travaillé.
je n'ai aucune idée si cette explication est logique, cependant il s'adapte intuitivement pour moi ;)
ces modifications semblent fonctionner, car ce code crée le polygone 3D désiré (j'ai remarqué que depuis que c'est mon premier post, Je ne suis pas autorisé à poster une figure preuve-of-the-pudding.... )
espère que cela a été utile,
salutations
vous devez utiliser Poly3DCollection au lieu de 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()