2011-01-07 2 views
47

ero web browsing senza successo di una soluzione per la seguente questione semplice:plottaggio poligoni 3D in python-matplotlib


come disegnare poligoni 3D (per esempio un rettangolo o triangolo pieno) utilizzando i valori vertici? Ho provato molte idee, ma tutti falliti, vedi:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.collections import PolyCollection 
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(PolyCollection(verts),zs=z) 
plt.show() 

Apprezzo in anticipo qualche idea/commento.

Aggiornamenti in base alla risposta accettata:

import mpl_toolkits.mplot3d as a3 
import matplotlib.colors as colors 
import pylab as pl 
import scipy as sp 

ax = a3.Axes3D(pl.figure()) 
for i in range(10000): 
    vtx = sp.rand(3,3) 
    tri = a3.art3d.Poly3DCollection([vtx]) 
    tri.set_color(colors.rgb2hex(sp.rand(3))) 
    tri.set_edgecolor('k') 
    ax.add_collection3d(tri) 
pl.show() 

Ecco il risultato: enter image description here

+1

Come può essere aggiornata questa soluzione per Python 3.5? Questa versione mi dà l'errore che 'TypeError: oggetto di tipo 'zip' non ha len()' – jlt199

+1

@ jlt199 Usa semplicemente '[lista (zip (...))]' o se usi numpy> 1.10 '[np. stack ([X, Y, Z], axis = 1)] 'o' [np.stack ([X, Y, Z], axis = 1)] ' – Y0da

risposta

43

Credo che tu abbia quasi fatta. È questo che vuoi?

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)) 
plt.show() 

alt text Potreste anche essere interessati a art3d.pathpatch_2d_to_3d.

+0

Vi ringrazio sinceramente. Questa è esattamente la mia risposta. In realtà, ho bisogno di simulare i piani di frattura in 3D. Quindi era la forma base. Dovrebbe essere facile quindi per me lavorare con migliaia di coordinate realistiche. Ti ringrazio ancora per il tuo grande aiuto. Fristal – Developer

+0

Come renderlo non chiuso? – Dims