1D X, Y ve Z değişkenleri kullanarak python'da 2D kontur grafiği
Python'da çok yeni olduğumu kabul ederek bu sorguya başlayayım. Süreci otomatikleştirmek için Python'da verilerin kontur grafiğini oluşturmak istiyorum, aksi takdirde Surfer kullanılarak kolayca gerçekleştirilebilir. Bu tür 1000 veri dosyam var ve manuel olarak oluşturmak çok sıkıcı olabilir. Kullandığım veriler aşağıdaki gibi görünüyor, 0, 1 ve 2 başlıklarına sahip bir veri çerçevesi ve indeks olarak 1,2, .. 279:
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]
Buraya,
x=data[0]
y=data[1]
z=data[2]
Kontur fonksiyonu olarak pf matplotlib, z'nin bir 2D dizisi olmasını gerektirir; karışıklığın başladığı yer burasıdır. Stackoverflow sorgularının birkaç çözümünün ardından aşağıdakileri yaptım:
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()
Yukarıdaki kodla bu grafik türetilmiştir.
Bununla birlikte, bu arzu edilmez ve eğer bir kez yüzeysel gürültü hatlarından görülebiliyorsa, o zaman, burada sörfçü tarafından oluşturulan kontur grafiğinden görüldüğü gibi, aslında arzu edilen, altta düzenli kontur çizgileri vardır.
Sörfçü grafiğini oluştururken aynı verilerin kullanıldığını tekrarlamak isterim.
İstenilen arsayı oluştururken herhangi bir yardım çok takdir edilecektir.
Yanıtlar
Cevap için @JohanC'ye teşekkürler. Sorgumla onun önerisini perspektife oturtmak istiyorum.
ax.contour
yerine ax.tricontour
geçmesi durumumu çözer. Ve ax.tricontourf
kontur dolgusunu yaptırır. Bu nedenle, kodumun son bölümü şöyle olacaktır:
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()