3D-Darstellung mit Matplotlib aus importierten Daten

764
lucian

Ich suche nach einer 3D-Oberfläche. Die Daten werden in mathematica generiert und in eine Datei mit drei durch Leerzeichen getrennten Spalten exportiert (ich kann sie in ein Komma oder ein anderes Trennzeichen setzen). Das Problem, das ich habe, ist, dass ich bisher gnuplot für alle meine 2D-Plots verwendet habe, aber für diesen speziellen Plot ist gnuplot nicht wirklich einfach zu bedienen und die Ergebnisse sind nicht so toll.

Ich habe über matplotlib gelesen, finde aber, dass die Dokumentation wirklich schwierig ist. Als ich mit gnuplot angefangen habe, habe ich hier eine wirklich gute Vorlage gefunden, mit der ich 2D-Plots und Multiplots beliebig generieren kann.

Gibt es etwas Ähnliches für Matplotlib, das ich verwenden kann? In fast allen Beispielen für Matplotlib gibt es Funktionen, die auf verschiedene Weise dargestellt werden. Es gibt jedoch keine Beispiele, bei denen Daten importiert und geplottet werden.

2
Es scheint, als könnten Sie die Daten in der Datei "funktionalisieren". Damit meine ich, dass Sie eine Funktion erstellen, die von matplotlib aufgerufen oder anderweitig verwendet werden kann und die die Dateidaten auf die Art und Weise bereitstellt, die sie erwartet / benötigt. martineau vor 5 Jahren 0
Ich verstehe nicht wirklich, was Sie unter Funktionalisieren verstehen. Wenn Sie damit meinen, dass ich die Daten (die jetzt von mathematica kommen) in matplotlib generieren soll, während dies prinzipiell machbar ist, habe ich keine Erfahrung mit Python, um dies zu tun. Ich habe ein ziemlich kompliziertes Programm in Mathematica geschrieben, das mir die Daten gibt. Das Problem ist, dass Mathematica in all seiner Macht eher schlechte zum Export geeignete Zahlen exportieren kann. lucian vor 5 Jahren 0
Nein, das meinte ich nicht mit dem (erfundenen) Begriff "funktionalisieren". Was ich zu beschreiben versuchte, war die Erstellung einer Funktion, die mit Matplotlibs vorhandenen Funktionen zum Plotten von Funktionen verwendet werden konnte, um die Daten (aus Ihrer vorhandenen exportierten Datei) in dem Format oder in der Art und Weise wiederzugeben, die sie erwartet oder benötigt. Python kann die Dateidaten problemlos lesen und ist in der Lage, diese Daten ggf. dem Anrufer (matplotlib) inkrementell bereitzustellen. Ich schlage vor, dass Sie Ihre Frage erneut an [stackoveflow] (https://stackoverflow.com/questions/tagged/python) stellen. martineau vor 5 Jahren 0
Ich hoffe es hilft. Wenn Sie dies tun, müssen Sie Ihre Frage mit den Tags "python" und "matplotlib" ** versehen. martineau vor 5 Jahren 0

1 Antwort auf die Frage

0
Moustache

Ich denke, Sie stellen hier einige Fragen. Ich werde versuchen, die grundlegendste Frage zu beantworten: Laden Sie Ihre CSV-Daten in Python und zeichnen Sie dann eine grundlegende Oberflächendarstellung.

Beachten Sie, dass Sie im Allgemeinen eine NxN-Matrix mit Z-Werten für ein Diagramm benötigen, bei dem X und Y Vektoren der Länge N sind. Dies ist sinnvoll, da jeder Punkt (x, y) einen Z-Wert benötigt und N x N (x) vorhanden ist y) Punkte. Ich werde dir zwei Wege zeigen. Sobald Sie diese haben, sind Sie zumindest in der Lage, Ihren Plot anhand der Dokumentation und anderer Beispiele aus dem Web anzupassen.

Diese Antwort setzt voraus, dass Sie Python 3 und eine aktuelle Version von Matplotlib und Numpy verwenden . (Numpy ist ein numerisches Python-Paket, das üblicherweise in Python-Distributionen enthalten ist, z. B. Anaconda.) Die Syntax sollte sich jedoch in älteren Versionen nicht sehr unterscheiden.

Machen Sie zuerst die notwendigen Importe:

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

Für den Fall, dass Sie 3 Spalten mit 1d-Daten haben - x, y und z:

DataAll1D = np.loadtxt("datacsv_1d.csv", delimiter=",")  # create 2d x,y grid (both X and Y will be 2d) X, Y = np.meshgrid(DataAll1D[:,0], DataAll1D[:,1])  # repeat Z to make it a 2d grid Z = np.tile(DataAll1D[:,2], (len(DataAll1D[:,2]), 1))  fig = plt.figure() ax = fig.add_subplot(111, projection='3d')  ax.plot_surface(X, Y, Z, cmap='ocean')  plt.show() 

enter image description here

Beachten Sie, dass Sie in np.loadtxt ein beliebiges Trennzeichen festlegen können, z. B. '' für ein Leerzeichen.

Für den Fall, dass Sie 2 Spalten mit 1d-Daten haben - x und y - und eine 2d-Matrix mit z-Daten:

DataX_Y_1D = np.loadtxt("datacsv_1d_xy.csv", delimiter=",")  # create 2d x,y grid (both X and Y will be 2d) X, Y = np.meshgrid(DataX_Y_1D[:,0], DataX_Y_1D[:,1])  # get 2D z data Z = np.loadtxt("datacsv_2d_Z.csv", delimiter=",")  fig = plt.figure() ax = fig.add_subplot(111, projection='3d')  ax.plot_surface(X, Y, Z, cmap='ocean')  plt.show() 

enter image description here

Hier finden Sie einen Link zu einem weiteren guten Tutorial zu diesem Thema:

https://jakevdp.github.io/PythonDataScienceHandbook/04.12-three-dimensional-plotting.html

Bearbeiten: Für den Fall, dass Sie alle erforderlichen Datenpunkte in 3 Spalten (X, Y, Z) haben, plot_trisurfist dies das, was Sie brauchen. Ein einfaches Beispiel finden Sie in meiner Antwort zu Stack Overflow: https://stackoverflow.com/questions/39240327/3d-surface-plot-using-matplotlib-in-python/52630484#52630484

vielen Dank! Dies ist eine sehr klare Antwort! Ich werde versuchen, darauf aufzubauen! lucian vor 5 Jahren 1
Sicher --- Fühlen Sie sich frei, eine neue Frage / Kommentar zu posten, wenn Sie eine Klarstellung benötigen. Oberflächenplots sind immer etwas knifflig. Moustache vor 5 Jahren 0
Hinweis: Ich habe eine weitere Antwort für den Fall geschrieben, wenn Sie nur 3 Spalten mit unstrukturierten X-, Y- und Z-Daten haben (wenn alle erforderlichen Datenpunkte in diesen 3 Spalten enthalten sind) im Stapelüberlauf: https://stackoverflow.com/questions / 39240327 / 3d-oberfläche-plot-using-matplotlib-in-python / 52630484 # 52630484 Moustache vor 5 Jahren 0