Cara memplot tatasusunan ketumpatan menggunakan matplotlib.pyplot.contourf

WBOY
Lepaskan: 2024-02-12 22:27:03
ke hadapan
754 orang telah melayarinya

如何使用 matplotlib.pyplot.contourf 绘制密度数组

Kandungan soalan

Saya mempunyai set data xarray yang dipanggil dens dan saya ingin merancangnya.

Ini ialah set data:

<xarray.dataset>
dimensions:  (time: 641, lat: 30, lon: 30)
coordinates:
  * time     (time) datetime64[ns] 2013-07-01t12:00:00 ... 2013-08-02t12:00:00
  * lon      (lon) float64 32.73 32.83 32.94 33.05 ... 35.53 35.64 35.75 35.85
  * lat      (lat) float64 31.08 31.27 31.47 31.66 ... 36.06 36.25 36.44 36.63
data variables:
    density  (time, lat, lon) float64 2e+03 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0
Salin selepas log masuk

Saya menggunakan arahan

plt.contourf(dens.density.values[-1,:,:]);
Salin selepas log masuk

merancangnya dan ia berfungsi, tetapi kerana saya mahu garis pantai juga diplot pada plot itu, saya juga cuba menggunakan

m = basemap(llcrnrlon=data['lon'].min(), llcrnrlat=data['lat'].min(),
                urcrnrlon=data['lon'].max(), urcrnrlat=data['lat'].max(), resolution='i', suppress_ticks=1)
m.drawcoastlines();
m.fillcontinents(color='gray',lake_color='gray');
Salin selepas log masuk

Tetapi apabila saya menjalankan semua arahan dan kemudian plt.show() plot kontur hilang dan semua yang ditunjukkan kepada saya ialah garis pantai.

Bagaimana untuk menyelesaikan masalah ini untuk mendapatkan peta kontur + peta garis pantai dalam rajah yang sama?

Maaf jika ini soalan bodoh tetapi saya agak baru dengan python

Terima kasih atas bantuan anda,

Yutam

Edit: Saya baru sedar sekarang bahawa saya cuba menggabungkan dua "kit alat" yang berbeza dan semua ini boleh dilakukan dengan hanya menggunakan kit alat peta asas, tetapi hanya cuba menulis

m.contourf(dens.density.values[-1,:,:]);
Salin selepas log masuk

memberi saya ralat ini:

---------------------------------------------------------------------------
typeerror                                 traceback (most recent call last)
cell in[21], line 1
----> 1 m.contourf(dens.density.values[-1,:,:])

typeerror: basemap.contourf() missing 2 required positional arguments: 'y' and 'data'
Salin selepas log masuk

Suntingan lain: Saya terus menemui lebih banyak lagi dan selepas membaca dokumentasi untuk peta asas saya menyedari sintaks arahan sepatutnya seperti ini

m.contourf(dens.lon.values,dens.lat.values,dens.密度.values[-1,:,:]);

Tetapi sekarang saya mendapat ralat ini:

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
Salin selepas log masuk

Saya rasa ini kerana tatasusunan ketumpatan saya ialah 2D, tetapi bagaimanakah cara saya mengekstrak nilai ketumpatan daripadanya? Saya menggunakan [-1] dalam dimensi masa kerana saya sebenarnya hanya memerlukan langkah kali terakhir

Terima kasih sekali lagi terlebih dahulu, Yotam

Suntingan Terakhir

Ini adalah plot terakhir, bagaimana saya boleh menjadikan tanah sekeliling berwarna kelabu dan bukannya ungu? Juga, adakah terdapat cara untuk menerangkan kawasan geografi yang lebih besar, lebih besar sedikit, tanpa mengacaukan data?

Berikut ialah nombor baharu untuk data sebenar saya


Jawapan betul


Memplot menggunakan peta asas dan xarray telah dibincangkan di sini.

m = basemap(llcrnrlon=data['lon'].min(), llcrnrlat=data['lat'].min(),
            urcrnrlon=data['lon'].max(), urcrnrlat=data['lat'].max(), 
  resolution='i', suppress_ticks=1)
m.drawcoastlines();
m.fillcontinents(color='gray',lake_color='gray')
dens.density[-1,:,:].plot.contourf()
plt.show()
Salin selepas log masuk

Kod di atas sepatutnya berfungsi. Saya menggunakan cartopy untuk mengendalikan ciri seperti garis pantai dan sempadan. Di bawah ialah coretan kod yang berfungsi untuk anda cuba menggunakan set data.

import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cf

ds = xr.open_dataset('filename.nc')
fig = plt.figure(figsize=(8,8))
crs=ccrs.platecarree()
ax = fig.add_subplot(1,1,1, projection=crs)
gl = ax.gridlines(crs=crs, draw_labels=true,
                linewidth=0.01, color='gray', alpha=0.5, linestyle='-.')

ax.add_feature(cf.coastline.with_scale("50m"), lw=0.5)
ax.add_feature(cf.borders.with_scale("50m"), lw=0.3)

ds.density[-1,:,:].plot.contourf()
plt.show()
Salin selepas log masuk

Suntingan terakhir

Untuk menetapkan semua ungu (sifar) kepada putih anda boleh menggunakan cmap berikut.

from matplotlib.colors import LinearSegmentedColormap
cm = LinearSegmentedColormap.from_list('', ['white', *plt.cm.Blues(np.arange(255))])
ds.density[-1,:,:].plot.contourf(cmap=cm)
Salin selepas log masuk

Atas ialah kandungan terperinci Cara memplot tatasusunan ketumpatan menggunakan matplotlib.pyplot.contourf. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan