2017-07-04 6 views
0

Ich suche jetzt schon lange nach der richtigen Implementierung.3D-Polygone in 2D plotten

Ich habe eine 3D Delaunay Triangulation und möchte dies in 2D darstellen. In 3D kann ich es tun: Complex 3D delauny triangulation. Half of the triangles hidden.

Ich brauche ein 2D-Plot obwohl. Was erhalte ich mit matplotlib.tripcolor Methode oder die matplotlib.collections.PolyCollection ist:

Complex 3D delauny triangulation mapped to 2D. Some triangles from the back of the structure are plotted

Wie ich dies ohne die oben in 2D Sie plotten und zurück Dreiecke alles durcheinander? Bei allen bisher erprobten Methoden sind einige Dreiecke durch Dreiecke verdeckt, die sich hinten in der Struktur befinden sollten.

Ich sehe, dass die Methoden einfach nicht die notwendigen Informationen haben, um in der richtigen Reihenfolge zu plotten, da ich bereits 2D-Arrays bereitstellen muss. Die Tiefeninformation ist verloren.

Weiß jemand, wie man das macht? Vielen Dank!

+0

Vielleicht eine der Antworten auf [diese Frage] zu demonstrieren modifizierte (https://stackoverflow.com/questions/33084853/ Set-Matplotlib-Ansicht-zu-Normal-zu-der-XY-Ebene-in-Python) wird tun, was Sie wollen – user3419537

+0

Nicht ganz. Der Winkel ist im oberen Bild bereits richtig eingestellt. Das Problem ist, dass ich andere Dinge in 2D oben plotten möchte. Also ich möchte wirklich 2D –

+1

Matplotlib ist keine 3D-Engine per se. Da ist das Rendering fehlerhaft. Sie können tripcolor nur mit den vorderen Dreiecken verwenden. Aber das bedeutet wahrscheinlich, dass Sie überprüfen müssen, welche Dreiecke Scheitelpunkte mit einem "x" größer als etwas haben, und alle anderen zeichnen. Dies kann je nach "Form" Ihres Volumes besser oder schlechter funktionieren, aber Sie gehen davon aus, dass es keine pixelgenaue Tiefenprüfung gibt. Wenn die Form zu komplex ist, müssen Sie möglicherweise einen eigenen kleinen Rendering-Algorithmus erstellen (vielleicht mit imshow o.ä.). – armatita

Antwort

1

Sie können ein 2D-Diagramm mit Axes3d nachahmen, indem Sie eine orthografische Projektion einstellen, die Ansicht auf die gewünschte Ebene ausrichten und unerwünschte Zeichenelemente entlang der Achse orthogonal zur ausgewählten Ansichtsebene entfernen. Außerdem können Sie 2D-Elemente mit dem Schlüsselwort zdir plotten.

Hier ist eine der matplotlib 3D-Plot Beispiele I

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import numpy as np 

# Enable orthographic projection 
# https://stackoverflow.com/questions/23840756/how-to-disable-perspective-in-mplot3d 
from mpl_toolkits.mplot3d import proj3d 
def orthogonal_proj(zfront, zback): 
    a = (zfront+zback)/(zfront-zback) 
    b = -2*(zfront*zback)/(zfront-zback) 
    return np.array([[1,0,0,0], 
         [0,1,0,0], 
         [0,0,a,b], 
         [0,0,-0.000001,zback]]) 
proj3d.persp_transformation = orthogonal_proj 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

# Init view to YZ plane 
ax.view_init(azim=0, elev=0) 

# Hide the X axis 
ax.w_xaxis.line.set_lw(0.) 
ax.set_xticks([]) 

# Change YZ plane colour to white 
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0)) 

# Make data. 
X = np.arange(-5, 5, 0.25) 
Y = np.arange(-5, 5, 0.25) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 

# Plot the surface. 
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, 
         linewidth=0, antialiased=False) 
ax.set_zlim(-1.1, 1.1) 
ax.set_ylabel('y') 
ax.set_zlabel('z') 

# Plot 2D elements with zdir argument 
# https://stackoverflow.com/questions/29549905/pylab-3d-scatter-plots-with-2d-projections-of-plotted-data 
stepsize = 0.1 
t = np.arange(-4, 4+stepsize, step=stepsize) 
ax.plot(t, 0.5*np.sin(t), 'k', zdir='x', linewidth=1.0) 
ax.text(0, 0, 1, 'Text', zdir='y', ha='center', va='top') 

plt.show() 

enter image description here

+0

Danke. Ich werde das untersuchen. –