2011-01-07 10 views
47

miałem nieudane Przeglądanie sieci rozwiązania dla następnego proste pytanie:kreślenia 3D wielokątów w python-matplotlib


Jak narysować wielokąt 3D (słownie wypełniony prostokąt lub trójkąt) przy użyciu wartości wierzchołki? Próbowałem wiele pomysłów, ale nie powiodła się, zobacz:

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

doceniam z góry jakiś pomysł/komentarz.

Aktualizacje na podstawie zaakceptowanych odpowiedź:

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

Oto wynik: enter image description here

+1

Jak to rozwiązanie można zaktualizować w Pythonie 3.5? Ta wersja daje mi błąd, że 'TypeError: obiekt typu 'zip' nie ma len()' – jlt199

+1

@ jlt199 Po prostu użyj '[list (zip (...))]' lub jeśli używasz numpy> 1.10 '[np. stos ([X, Y, Z], oś = 1)] lub "[np.stack ([X, Y, Z], oś = 1)]" – Y0da

Odpowiedz

43

myślę, że prawie dostał. Czy to jest to, czego chcesz?

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 Możesz być także zainteresowany art3d.pathpatch_2d_to_3d.

+0

Szczerze dziękuję bardzo. To jest dokładnie moja odpowiedź. Właściwie to muszę symulować płaszczyzny pęknięcia w 3D. Tak więc była to podstawowa forma. To powinno być dla mnie łatwe do pracy z tysiącami realistycznych współrzędnych. Jeszcze raz dziękuję za pomoc. Fristal – Developer

+0

Jak zrobić, że nie jest zamknięty? – Dims