Plot kontur 2D pada python menggunakan variabel 1D X, Y dan Z.

Aug 15 2020

Izinkan saya memulai kueri ini dengan mengakui bahwa saya sangat baru mengenal Python. Saya ingin membuat plot kontur data dengan Python untuk mengotomatiskan proses, yang jika tidak dapat dengan mudah dilakukan dengan menggunakan Surfer. Saya memiliki 1000 file data seperti itu, dan membuat secara manual bisa sangat membosankan. Data yang saya gunakan terlihat seperti berikut, yaitu dataframe dengan header 0, 1 dan 2 dan 1,2, .. 279 sebagai 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]

Sini,

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

Karena fungsi kontur pf matplotlib membutuhkan z untuk menjadi array 2D; disinilah kebingungan dimulai. Mengikuti beberapa solusi kueri stackoverflow, saya melakukan hal berikut:

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

Dengan kode di atas plot ini diturunkan.

Namun hal tersebut tidak diinginkan dan jika sekali dapat melihat melalui garis-garis noise permukaan maka terdapat garis kontur yang berurutan dibawahnya, yang sebenarnya diinginkan seperti terlihat dari plot kontur yang dihasilkan oleh para surfer disini.

Saya ingin menegaskan kembali bahwa data yang sama digunakan dalam membuat plot surfer.

Bantuan apa pun dalam menciptakan plot yang diinginkan akan sangat dihargai.

Jawaban

ChandanDey Oct 07 2020 at 18:34

Terima kasih kepada @JohanC atas jawabannya. Saya ingin meletakkan sarannya pada perspektif dengan pertanyaan saya.

ax.contourdiganti dengan ax.tricontourmemecahkan situasi saya. Dan ax.tricontourfmenyelesaikan pengisian kontur. Oleh karena itu, segmen terakhir dari kode saya adalah:

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