Gráfico de contorno 2D em python usando variáveis 1D X, Y e Z
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
Obrigado a @JohanC pela resposta. Eu gostaria de colocar sua sugestão em perspectiva com minha consulta.
ax.contour
substituído por ax.tricontour
resolve minha situação. E ax.tricontourf
faz 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()