2D-Konturdiagramm in Python unter Verwendung von 1D X-, Y- und Z-Variablen

Aug 15 2020

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

ChandanDey Oct 07 2020 at 18:34

Vielen Dank an @JohanC für die Antwort. Ich möchte seinen Vorschlag mit meiner Anfrage relativieren.

ax.contourersetzt durch ax.tricontourlöst meine Situation. Und ax.tricontourferledigt 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()