我是使用cartopy包的新手。我想使用netcdf格式的给定二进制地图中的陆地和海洋掩码。这里,lsm_set是我的netcdf文件,其中包含该二进制映射,而t2m_set是我想要映射的数据。我还在玩cartopy,以掌握它的诀窍,但我似乎不知道如何使用陆地和海洋面膜。我在这里读到了几个相关的问题,但它们在我的代码中不起作用,因为我的t2m变量没有属性掩码。
我的老师说我可以用它将海值标记为"NaN“,但我不知道一种有效的方法。我试过使用while循环,但在处理这么多数据时速度非常慢:')
我在下面的链接上使用了哥白尼研究所的数据:https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-uerra-europe-single-levels?tab=form
import os
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc
from netCDF4 import Dataset
import xarray as xr
from cartopy import config
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
filepath1 = '... file path... '
lsm_set = xr.open_dataset(filepath1)
filepath2 = '... file path...'
t2m_set= xr.open_dataset(filepath2)
lons = lsm_set.variables['longitude']#[:]
lats = lsm_set.variables['latitude']#[:]
lsm = lsm_set.variables['lsm']
t2m = t2m_set.variables['t2m']
plt.figure(figsize=(8, 8))
ax = plt.axes(projection = ccrs.Mercator())
ax.contourf(lons[200:400,100:300], lats[100:300,200:400], t2m[100:300,100:300],transform=ccrs.Mercator())
lsm_set.close()
t2m_set.close()
plt.show()任何在正确方向上的推动都是值得感谢的,谢谢!
解决了!
事实证明,解决方案比我想象的要简单得多。
lons = t2m_set.variables['longitude']#[:]
lats = t2m_set.variables['latitude']#[:]
lsm = lsm_set.variables['lsm']
t2m = t2m_set.variables['t2m']
lsm_masked = lsm.where(lsm!=0.)
mapdata = t2m+lsm_masked然后绘制mapdata,而不仅仅是t2m
发布于 2021-09-16 12:58:17
您可以使用xarray的where方法:
t2m_set.where(lsm_set)它应该会给你一个屏蔽得很好的xarray.Dataset。
发布于 2021-09-15 22:32:06
假设您的陆地/海洋数据为1和0,大小与您的数据相同……然后你就可以很容易地画出这样的图:
#!/usr/bin/env ipython
# --------------------
import matplotlib as mpl
mpl.rcParams['font.size'] = 18
import matplotlib.pylab as plt
import numpy as np
# -----------------------------
xx = np.linspace(9.,30,100);
yy = np.linspace(54.0,66.0,100);
xm,ym = np.meshgrid(xx,yy);
zz = 50.0 + 10.0*np.random.random((np.size(yy),np.size(xx)));
# -----------------------------
# let me have some random landmask/seamask data:
smask = np.zeros(np.shape(zz));smask[0:10,0:10]=1.0;smask[60:90,60:90]=1.0;
# -----------------------------
# let us set 0.0 to NaNs in seamask:
smask[smask==0]=np.nan;
smask=np.ma.array(smask,mask=np.isnan(smask))
# -----------------------------
# let us make a plot:
fig = plt.figure();ax=fig.add_subplot(111);
ax.pcolormesh(xx,yy,zz);
ax.pcolormesh(xx,yy,smask,vmin=0.0,vmax=8.0,cmap='Greys');
plt.show()
# ------------------------------------------------------------https://stackoverflow.com/questions/69192394
复制相似问题