Gráfico de contorno 2D em python usando variáveis ​​1D X, Y e Z

Aug 15 2020

Deixe-me começar esta pergunta admitindo que sou muito novo em Python. Eu quero criar um gráfico de contorno dos dados em Python para automatizar o processo, que de outra forma pode ser facilmente realizado usando o Surfer. Tenho milhares desses arquivos de dados, e criar manualmente pode ser muito tedioso. Os dados que estou usando são os seguintes, que são um quadro de dados com cabeçalhos 0, 1 e 2 e 1,2, .. 279 como índice:

     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]

Aqui,

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

Como a função de contorno pf matplotlib requer que z seja um array 2D; é aqui que começa a confusão. Seguindo várias soluções de consultas stackoverflow, fiz o seguinte:

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

Com o código acima, esse gráfico é derivado.

No entanto, não é desejado e se uma vez puder ver através das linhas de ruído superficial, então existem linhas de contorno ordenadas embaixo, o que na verdade é desejado visto a partir do gráfico de contorno gerado pelo surfista aqui.

Gostaria de reiterar que os mesmos dados foram usados ​​na geração do enredo do surfista.

Qualquer ajuda na criação do enredo desejado será muito apreciada.

Respostas

ChandanDey Oct 07 2020 at 18:34

Obrigado a @JohanC pela resposta. Eu gostaria de colocar sua sugestão em perspectiva com minha consulta.

ax.contoursubstituído por ax.tricontourresolve minha situação. E ax.tricontourffaz o preenchimento do contorno. Portanto, o último segmento do meu código seria:

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