Grafico di contorno 2D in Python utilizzando 1D X, Y e Z variabili

Aug 15 2020

Vorrei iniziare questa domanda ammettendo che sono molto nuovo in Python. Voglio creare un contour plot dei dati in Python in modo da automatizzare il processo, che altrimenti può essere facilmente eseguito utilizzando Surfer. Ho migliaia di tali file di dati e la creazione manuale potrebbe essere molto noiosa. I dati che sto utilizzando sono i seguenti, che è un dataframe con intestazioni 0, 1 e 2 e 1,2, .. 279 come indice:

     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]

Qui,

x=data[0]
y=data[1]
z=data[2]

Come funzione contour pf matplotlib richiede che z sia un array 2D; è qui che inizia la confusione. Seguendo diverse soluzioni di query stackoverflow, ho eseguito quanto segue:

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()

Con il codice sopra viene derivato questo grafico.

Tuttavia, non è desiderato e se una volta è possibile vedere attraverso le linee di rumore superficiale, ci sono linee di contorno ordinate al di sotto, che in realtà è desiderato come si vede dal grafico di contorno generato dal surfista qui.

Vorrei ribadire che gli stessi dati sono stati utilizzati per generare il grafico del surfista.

Qualsiasi aiuto nella creazione della trama desiderata sarà molto apprezzato.

Risposte

ChandanDey Oct 07 2020 at 18:34

Grazie a @JohanC per la risposta. Vorrei mettere in prospettiva il suo suggerimento con la mia domanda.

ax.contoursostituito da ax.tricontourrisolve la mia situazione. E ax.tricontourfottiene il riempimento del contorno. Pertanto, l'ultimo segmento del mio codice sarebbe:

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()