Rumah >pembangunan bahagian belakang >Tutorial Python >Cara memplot tatasusunan ketumpatan menggunakan matplotlib.pyplot.contourf

Cara memplot tatasusunan ketumpatan menggunakan matplotlib.pyplot.contourf

WBOY
WBOYke hadapan
2024-02-12 22:27:03783semak imbas

如何使用 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

Saya menggunakan arahan

plt.contourf(dens.density.values[-1,:,:]);

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');

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,:,:]);

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'

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

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

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

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)

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam