Plot kontur 2D pada python menggunakan variabel 1D X, Y dan Z.
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
Terima kasih kepada @JohanC atas jawabannya. Saya ingin meletakkan sarannya pada perspektif dengan pertanyaan saya.
ax.contour
diganti dengan ax.tricontour
memecahkan situasi saya. Dan ax.tricontourf
menyelesaikan 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()