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?

1
demandé sur Serenity 2016-06-02 10:29:23

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:

  1. 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.

  2. a changé la ligne: verts = list(zip(x,y,z)) en verts = [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

5
répondu furk 2016-06-15 10:27:09

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()

enter image description here

1
répondu Serenity 2016-06-02 07:52:13