Wykres konturowy 2D w Pythonie przy użyciu zmiennych 1D X, Y i Z.

Aug 15 2020

Zacznę to pytanie od przyznania, że ​​jestem bardzo nowy w Pythonie. Chcę utworzyć wykres konturowy danych w Pythonie, aby zautomatyzować proces, który w przeciwnym razie można łatwo przeprowadzić za pomocą Surfera. Mam tysiące takich plików danych, a ręczne tworzenie mogłoby być bardzo żmudne. Dane, których używam, wyglądają następująco, czyli ramka danych z nagłówkami 0, 1 i 2 oraz 1,2, .. 279 jako indeks:

     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]

Tutaj,

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

Ponieważ funkcja konturu pf matplotlib wymaga, aby z był tablicą 2D; tu zaczyna się zamieszanie. Po kilku rozwiązaniach zapytań stackoverflow wykonałem następujące czynności:

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

Z powyższego kodu wyprowadza się ten wykres.

Jednak nie jest to pożądane i jeśli raz można przejrzeć linie szumów powierzchniowych, to pod spodem znajdują się uporządkowane linie konturowe, co w rzeczywistości jest pożądane, jak widać z wykresu konturowego wygenerowanego tutaj przez surfera.

Chciałbym powtórzyć, że te same dane zostały użyte do wygenerowania wykresu dla surferów.

Każda pomoc w stworzeniu pożądanej fabuły będzie bardzo mile widziana.

Odpowiedzi

ChandanDey Oct 07 2020 at 18:34

Dzięki @JohanC za odpowiedź. Chciałbym odnieść jego sugestię do mojego zapytania.

ax.contourzastąpiony przez ax.tricontourrozwiązuje moją sytuację. I ax.tricontourfwykonuje wypełnienie konturu. Dlatego ostatni segment mojego kodu wyglądałby tak:

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