問題內(nèi)容
我有一個名為 dens 的 xarray 數(shù)據(jù)集,我想繪制它。
這是數(shù)據(jù)集:
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
登錄后復(fù)制
我正在使用命令
plt.contourf(dens.density.values[-1,:,:]);
登錄后復(fù)制
繪制它并且它正在工作,但由于我希望海岸線也繪制在繪圖上,所以我也嘗試使用
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');
登錄后復(fù)制
但是當我運行所有命令,然后運行 ??plt.show()
時,等高線圖消失,它向我顯示的只是海岸線。
如何解決此問題以獲得同一圖中的等高線圖+海岸線圖?
抱歉,如果這是一個愚蠢的問題,但我對 python 還很陌生
感謝您的幫助,
尤塔姆
編輯:我現(xiàn)在才意識到我正在嘗試組合兩個不同的“工具包”,并且有可能僅使用底圖工具包來完成所有這些操作,但只是嘗試寫
m.contourf(dens.density.values[-1,:,:]);
登錄后復(fù)制
給我這個錯誤:
--------------------------------------------------------------------------- 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'
登錄后復(fù)制
另一個編輯:我不斷發(fā)現(xiàn)更多的東西,在閱讀了 basemap 的文檔后,我意識到命令的語法應(yīng)該是這樣的
m.contourf(dens.lon.values,dens.lat.values,dens.密度.values[-1,:,:]);
但現(xiàn)在我收到此錯誤:
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
登錄后復(fù)制
我猜這是因為我的密度數(shù)組是二維的,但是如何從中提取密度值?我在時間維度中使用 [-1],因為我實際上只需要最后一個時間步
再次提前致謝,
約塔姆
最后編輯
這是最終的情節(jié),我怎樣才能讓周圍的土地變成灰色而不是紫色?另外,有沒有一種方法可以描述更大的地理區(qū)域,稍微大一點,而不弄亂數(shù)據(jù)?
這是我的實際數(shù)據(jù)的新數(shù)字
正確答案
使用底圖和 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()
登錄后復(fù)制
上面的代碼應(yīng)該可以工作。
我使用 cartopy 來處理海岸線和邊界等功能。下面是可供您嘗試使用數(shù)據(jù)集的工作代碼片段。
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()
登錄后復(fù)制
最后一次編輯
要將所有紫色(零)設(shè)置為白色,您可以使用以下 cmap。
from matplotlib.colors import LinearSegmentedColormap cm = LinearSegmentedColormap.from_list('', ['white', *plt.cm.Blues(np.arange(255))]) ds.density[-1,:,:].plot.contourf(cmap=cm)
登錄后復(fù)制