Tracé de contour 2D en python utilisant des variables 1D X, Y et Z

Aug 15 2020

Permettez-moi de commencer cette requête en admettant que je suis très nouveau dans Python. Je souhaite créer un tracé de contour des données en Python afin d'automatiser le processus, qui autrement peut être facilement réalisé à l'aide de Surfer. J'ai des milliers de fichiers de données de ce type et la création manuelle pourrait être très fastidieuse. Les données que j'utilise se présentent comme suit, qui est un dataframe avec 0, 1 et 2 en-têtes et 1, 2, .. 279 comme 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]

Ici,

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

Comme la fonction de contour pf matplotlib nécessite que z soit un tableau 2D; c'est là que commence la confusion. Suite à plusieurs solutions de requêtes stackoverflow, j'ai effectué les opérations suivantes:

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

Avec le code ci-dessus, ce graphique est dérivé.

Cependant, cela n'est pas souhaité et si une fois peut voir à travers les lignes de bruit de surface, il y a des lignes de contour ordonnées en dessous, ce qui est en fait souhaité comme vu du tracé de contour généré par le surfeur ici.

Je tiens à réitérer que les mêmes données ont été utilisées pour générer le tracé du surfeur.

Toute aide dans la création de l'intrigue souhaitée sera très appréciée.

Réponses

ChandanDey Oct 07 2020 at 18:34

Merci à @JohanC pour la réponse. J'aimerais mettre sa suggestion en perspective avec ma question.

ax.contourremplacé par ax.tricontourrésout ma situation. Et ax.tricontourffait le remplissage du contour. Par conséquent, le dernier segment de mon code serait:

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