Ich habe eine Liste von 3 Tupeln, die eine Reihe von Punkten im 3D-Raum darstellen. Ich möchte eine Oberfläche zeichnen, die alle diese Punkte abdeckt.
Die plot_surface
Funktion im mplot3d
Paket erfordert als Argumente X, Y und Z 2d-Arrays. Ist plot_surface
die richtige Funktion zum Zeichnen der Oberfläche und wie transformiere ich meine Daten in das erforderliche Format?
data = [(x1,y1,z1),(x2,y2,z2),.....,(xn,yn,zn)]
python
numpy
matplotlib
surface
Graddy
quelle
quelle
Antworten:
Bei Oberflächen unterscheidet es sich ein wenig von einer Liste mit 3 Tupeln. Sie sollten ein Raster für die Domäne in 2D-Arrays übergeben.
Wenn Sie nur eine Liste von 3D-Punkten anstelle einer Funktion haben
f(x, y) -> z
, haben Sie ein Problem, da es mehrere Möglichkeiten gibt, diese 3D-Punktwolke in eine Oberfläche zu triangulieren.Hier ist ein Beispiel für eine glatte Oberfläche:
quelle
f(x,y) -> z
näher erläutern, wie Sie mit einer Funktion mehr Informationen erhalten, als nur einen Listenansatz zu verwenden, wie er das OP ursprünglich hatte?plot_trisurf
stattdessen umsehen. Aber wie ich bereits erwähnt habe, ist es nicht trivial, da Sie die Oberfläche triangulieren müssen und es mehrere Lösungen gibt. Betrachten Sie als grundlegendes Beispiel nur die 4 Punkte, die durch (0, 0, 0,2), (0, 1, 0), (1, 1, 0,2), (1, 0, 0) gegeben sind. Von oben gesehen sieht es aus wie ein Quadrat mit einer leichten Falte. Aber entlang welcher Diagonale tritt die "Falte" auf? Ist es die "hohe" Diagonale bei 0,2 oder die "niedrige" Diagonale bei 0? Beides sind gültige Oberflächen! Sie müssen also einen Triangulationsalgorithmus auswählen, bevor Sie eine genau definierte Lösung finden.projection='3d'
im Aufruffig.add_subplot
ist ohne diesen Import nicht verfügbar.Sie können Daten direkt aus einer Datei und einem Plot lesen
Bei Bedarf können Sie vmin und vmax übergeben, um den Farbbalkenbereich zu definieren, z
Bonusbereich
Ich habe mich gefragt, wie ich einige interaktive Diagramme erstellen soll, in diesem Fall mit künstlichen Daten
quelle
Ich bin gerade auf dasselbe Problem gestoßen. Ich habe Daten gleichmäßig beabstandet , daß anstelle der 2-D - Arrays , die in 3-D - Arrays 1 ist
matplotlib
‚splot_surface
möchte. Meine Daten befanden sich zufällig in einem.pandas.DataFrame
Hier ist dasmatplotlib.plot_surface
Beispiel mit den Änderungen zum Zeichnen von 3 1-D-Arrays.Das ist das ursprüngliche Beispiel. Durch Hinzufügen dieses nächsten Bits wird das gleiche Diagramm aus 3 1-D-Arrays erstellt.
Hier sind die resultierenden Zahlen:
quelle
Emanuel hatte die Antwort, nach der ich (und wahrscheinlich viele andere) suchen. Wenn Sie 3D-Streudaten in 3 separaten Arrays haben, ist Pandas eine unglaubliche Hilfe und funktioniert viel besser als die anderen Optionen. Angenommen, Ihre x, y, z sind beliebige Variablen. In meinem Fall waren dies c, Gamma und Fehler, da ich eine Support-Vektor-Maschine getestet habe. Es gibt viele Möglichkeiten, die Daten zu zeichnen:
Drahtgitterdiagramm der Daten
3D-Streuung der Daten
Der Code sieht folgendermaßen aus:
Hier ist die endgültige Ausgabe:
quelle
Überprüfen Sie das offizielle Beispiel. X, Y und Z sind in der Tat 2d-Arrays. Numpy.meshgrid () ist eine einfache Methode, um 2d x, y-Maschen aus 1d x- und y-Werten zu erhalten.
http://matplotlib.sourceforge.net/mpl_examples/mplot3d/surface3d_demo.py
Hier ist eine pythonische Methode, um Ihre 3-Tupel in 3 1d-Arrays zu konvertieren.
Hier ist mtaplotlib delaunay Triangulation (Interpolation), es konvertiert 1d x, y, z in etwas Konformes (?):
http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.griddata
quelle
In Matlab Ich habe etwas ähnliches unter Verwendung der
delaunay
Funktion auf demx
,y
coords nur (nichtz
), dann Plotten mittrimesh
odertrisurf
unter Verwendungz
der Höhe.SciPy verfügt über die Delaunay- Klasse, die auf derselben zugrunde liegenden QHull-Bibliothek basiert wie die Matlab-
delaunay
Funktion. Daher sollten Sie identische Ergebnisse erhalten.Von dort aus sollten es einige Codezeilen sein, um dieses 3D-Plotten von Polygonen in Python-Matplotlib- Beispiel in das zu konvertieren, was Sie erreichen möchten, da
Delaunay
Sie die Spezifikation jedes dreieckigen Polygons erhalten.quelle
ax.plot_trisurf(..)
.Nur um einige weitere Gedanken hinzuzufügen, die anderen bei Problemen mit unregelmäßigen Domänentypen helfen können. Für eine Situation, in der der Benutzer drei Vektoren / Listen hat, x, y, z, die eine 2D-Lösung darstellen, bei der z als Oberfläche auf einem rechteckigen Gitter dargestellt werden soll, gelten die Kommentare von 'plot_trisurf ()' von ArtifixR. Ein ähnliches Beispiel, jedoch mit nicht rechteckiger Domäne, ist:
Der obige Code erzeugt:
Dies löst jedoch möglicherweise nicht alle Probleme, insbesondere wenn das Problem in einer unregelmäßigen Domäne definiert ist. In dem Fall, in dem die Domäne einen oder mehrere konkave Bereiche aufweist, kann die Delaunay-Triangulation dazu führen, dass außerhalb der Domäne falsche Dreiecke erzeugt werden. In solchen Fällen müssen diese Schurkendreiecke aus der Triangulation entfernt werden, um die korrekte Oberflächendarstellung zu erreichen. In diesen Situationen muss der Benutzer möglicherweise die Delaunay-Triangulationsberechnung explizit einbeziehen, damit diese Dreiecke programmgesteuert entfernt werden können. Unter diesen Umständen könnte der folgende Code den vorherigen Plotcode ersetzen:
Die nachstehenden Beispieldiagramme veranschaulichen die Lösung 1) mit falschen Dreiecken und 2) wo sie entfernt wurden:
Ich hoffe, dass das oben Genannte für Personen mit Konkavitätssituationen in den Lösungsdaten hilfreich sein kann.
quelle
Es ist nicht möglich, mit Ihren Daten direkt eine 3D-Oberfläche zu erstellen. Ich würde Ihnen empfehlen, ein Interpolationsmodell mit einigen Tools wie pykridge zu erstellen . Der Prozess umfasst drei Schritte:
pykridge
X
undY
verwenden Siemeshgrid
Z
Nachdem Sie Ihr Raster und die entsprechenden
Z
Werte erstellt haben, können Sie loslegenplot_surface
. Beachten Sie, dass diemeshgrid
Funktion abhängig von der Größe Ihrer Daten eine Weile ausgeführt werden kann. Die Problemumgehung besteht darin, mitnp.linspace
forX
undY
Achsen gleichmäßig verteilte Stichproben zu erstellen und dann eine Interpolation anzuwenden, um auf die erforderlichenZ
Werte zu schließen . Wenn ja, von der ursprünglichen die interpolierten Werte unterschiedlich könnten ,Z
weilX
undY
haben sich geändert.quelle