2D-Konturdiagramm in Python unter Verwendung von 1D X-, Y- und Z-Variablen
Lassen Sie mich mit dieser Abfrage beginnen, indem ich zugebe, dass ich für Python sehr neu bin. Ich möchte ein Konturdiagramm der Daten in Python erstellen, um den Prozess zu automatisieren, der ansonsten einfach mit Surfer ausgeführt werden kann. Ich habe Tausende solcher Datendateien, und das manuelle Erstellen kann sehr mühsam sein. Die Daten, die ich verwende, sehen wie folgt aus: Dies ist ein Datenrahmen mit 0, 1 und 2 Headern und 1,2, .. 279 als Index:
0 1 2
0 3 -1 -0.010700
1 4 -1 0.040100
2 5 -1 0.061000
3 6 -1 0.052000
4 7 -1 0.013100
.. .. .. ...
275 30 -9 -1.530100
276 31 -9 -1.362300
277 32 -9 -1.190200
278 33 -9 -1.083600
279 30 -10 -1.864600
[280 rows x 3 columns]
Hier,
x=data[0]
y=data[1]
z=data[2]
Als Konturfunktion benötigt pf matplotlib, dass z ein 2D-Array ist; Hier beginnt die Verwirrung. Nach mehreren Lösungen für Stackoverflow-Abfragen habe ich Folgendes ausgeführt:
import numpy as np
x=np.array(x)
y=np.array(y)
z=np.array(z)
X, Y = np.meshgrid(x, y)
import scipy.interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='cubic')
Z=rbf(X,Y)
lmin=data[2].min()
lmax=data[2].max()
progn=(lmax-lmin)/20
limit=np.arange(lmin,lmax,progn)
fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.contour(X,Y,Z,limit)
ax.set_title('Contour Plot')
plt.show()
Mit dem obigen Code wird dieses Diagramm abgeleitet.
Es ist jedoch nicht erwünscht, und wenn einmal durch die Oberflächengeräuschlinien gesehen werden kann, befinden sich darunter geordnete Konturlinien, was tatsächlich erwünscht ist, wie aus dem Konturdiagramm hervorgeht, das der Surfer hier erzeugt.
Ich möchte noch einmal betonen, dass bei der Erstellung des Surfer-Plots dieselben Daten verwendet wurden.
Jede Hilfe bei der Erstellung des gewünschten Grundstücks wird sehr geschätzt.
Antworten
Vielen Dank an @JohanC für die Antwort. Ich möchte seinen Vorschlag mit meiner Anfrage relativieren.
ax.contour
ersetzt durch ax.tricontour
löst meine Situation. Und ax.tricontourf
erledigt die Konturfüllung. Daher wäre das letzte Segment meines Codes:
fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.tricontour(X,Y,Z,limit)
ax.tricontourf(X,Y,Z,limit)
ax.set_title('Contour Plot')
plt.show()