首頁 > 後端開發 > Python教學 > 如何使用 matplotlib.pyplot.contourf 繪製密度數組

如何使用 matplotlib.pyplot.contourf 繪製密度數組

WBOY
發布: 2024-02-12 22:27:03
轉載
773 人瀏覽過

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

問題內容

我有一個名為 dens 的 xarray 資料集,我想繪製它。

這是資料集:

<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
登入後複製

我正在使用命令

plt.contourf(dens.density.values[-1,:,:]);
登入後複製

繪製它並且它正在工作,但由於我希望海岸線也繪製在繪圖上,所以我也嘗試使用

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');
登入後複製

但是當我運行所有命令,然後運行 plt.show() 時,等高線圖消失,它向我顯示的只是海岸線。

如何解決此問題以獲得同一圖中的等高線圖 海岸線圖?

抱歉,如果這是一個愚蠢的問題,但我對 python 還很陌生

感謝您的幫助,

尤塔姆

編輯:我現在才意識到我正在嘗試組合兩個不同的“工具包”,並且有可能僅使用底圖工具包來完成所有這些操作,但只是嘗試寫

m.contourf(dens.density.values[-1,:,:]);
登入後複製

給我這個錯誤:

---------------------------------------------------------------------------
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'
登入後複製

另一個編輯:我不斷發現更多的東西,在閱讀了 basemap 的文檔後,我意識到命令的語法應該是這樣的

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

但現在我收到此錯誤:

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
登入後複製

我猜這是因為我的密度數組是二維的,但是要如何從中提取密度值?我在時間維度中使用 [-1],因為我實際上只需要最後一個時間步驟

再次提前致謝, 約塔姆

最後編輯

這是最終的情節,我怎麼能讓周圍的土地變成灰色而不是紫色?另外,有沒有一種方法可以描述更大的地理區域,稍微大一點,而不弄亂資料?

這是我的實際數據的新數字


正確答案


#使用底圖和xarray 進行繪圖已在此處進行了討論.

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()
登入後複製

上面的程式碼應該可以工作。 我使用 cartopy 來處理海岸線和邊界等功能。以下是可供您嘗試使用資料集的工作程式碼片段。

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()
登入後複製

最後一次編輯

要將所有紫色(零)設為白色,您可以使用以下 cmap。

from matplotlib.colors import LinearSegmentedColormap
cm = LinearSegmentedColormap.from_list('', ['white', *plt.cm.Blues(np.arange(255))])
ds.density[-1,:,:].plot.contourf(cmap=cm)
登入後複製

以上是如何使用 matplotlib.pyplot.contourf 繪製密度數組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板