Xarray使用技巧
1. nc数据快速转换为dataframe形式
import xarray as xr
ds = xr.open_dataset("/mnt/e/Research_life/DATA/GLEAM/Ep_1980-2020_GLEAM_v3.5a_MO.nc")['Ep']
ds = ds.transpose('time','lat','lon')
ds[0,::].plot()
# transfer to dataframe
df = ds[0,::].to_dataframe().reset_index()
df
2. nc数据快速画图后存在旋转90度问题
接上文,只需要对调经纬度即可
import xarray as xr
ds = xr.open_dataset("/mnt/e/Research_life/DATA/GLEAM/Ep_1980-2020_GLEAM_v3.5a_MO.nc")['Ep']
ds = ds.transpose('time','lat','lon')
ds[0,::].plot()
3. nc数据经度范围从0-360转至-180-180
import xarray as xr
Pre = xr.open_dataset("/mnt/e/Research_life/DATA/Precipitation/precip.mon.total.v2018.nc").precip
Pre['lon'] = (Pre['lon'] + 180) % 360 - 180 # original data ranges from 0 to 360
Pre.sortby(Pre.lon)
4. nc数据指定数值范围变为某固定值
import xarray as xr
grace = xr.open_dataset("/mnt/e/Research_life/DATA/GRACE-mascon/deseasonal.nc").trend.loc[:'2015',:,:].resample(time='1M').mean(skipna=False)
# 6 levels
condlist = [(grace.values<=-1.6),(grace.values>-1.6)&(grace.values<=-1.3),(grace.values>-1.3)&(grace.values<=-.8),
(grace.values>-.8)&(grace.values<=-.5),(grace.values>-.5)&(grace.values<=.5),(grace.values>.5)]
choicelist = [-4,-3,-2,-1,0,1] # 对应的赋值列表
y = np.select(condlist, choicelist)
grace[:] = y # 将 y 的数据赋值给 x 变量
5. nc数据时间聚合(例如月值变为年值)
import xarray as xr
ds = xr.open_dataset("/mnt/e/Research_life/DATA/NDVI/NDVI_mvc_1982_2015_china.nc")
data = ds.NDVI_mvc.resample(time='1Y').mean(skipna=False)
6. nc数据屏蔽多年均值低于某阈值地区(本例以屏蔽NDVI多年平均值小于0.1的地区为例)
说明:data为三维数据(时间、纬度、经度),mask只是一个二维数组,需先变为三维后再进行屏蔽
## 屏蔽NDVI多年平均值小于0.1的地区
# 计算var的多年平均值,沿着time轴求平均
var_mean = np.nanmean(data, axis=0) # var_mean是一个二维数组,形状为(lat, lon)
# 找出var_mean小于0.01的地区,返回一个布尔数组
mask = np.where(var_mean < 0.1, True, False) # mask是一个二维数组,形状为(lat, lon),其中True表示小于0.1的地区,False表示大于等于0.1的地区
# 将mask应用到var上,创建一个掩膜数组
mask_3d = np.repeat(mask[np.newaxis, :, :], len(data['time']), axis=0)
var_masked = np.ma.array(data, mask=mask_3d) # var_masked是一个三维掩膜数组,形状为(time, lat, lon),其中被mask覆盖的元素被屏蔽掉
7. (接6)把三维数组转变为nc数据
## var_masked 写入nc数据
# 创建一个空字典
nc_dict = {}
# 将time, lat, lon, var_masked添加到字典中
nc_dict['time'] = {'dims': ('time',), 'data': data.time.values}
nc_dict['lat'] = {'dims': ('lat',), 'data': data.lat.values}
nc_dict['lon'] = {'dims': ('lon',), 'data': data.lon.values}
nc_dict['NDVI_mvc'] = {'dims': ('time', 'lat', 'lon'), 'data': var_masked}
# 使用`from_dict`,将字典转化为xr.Dataset对象
data = xr.Dataset.from_dict(nc_dict)
8. nc数据删选出指定时间范围(非连续时间)数据
case one:grace数据中有缺失值,其他数据按照grace数据时间对齐
grace = xr.open_dataset("/mnt/e/Research_life/DATA/GRACE-mascon/deseasonal.nc").trend.loc[:'2015',:,:].resample(time='1M').mean(skipna=False)
time_range = grace.time
grace = grace.loc[grace.time.dt.strftime('%Y-%m').isin(time_range.dt.strftime('%Y-%m')),:,:]
## import landcover data
LC = xr.open_dataarray("/mnt/e/Research_life/DATA/Land cover/MODIS LAND_USE-0.05-QuanQiu/LC.nc")
LC = LC.loc[LC.time.dt.strftime('%Y-%m').isin(time_range.dt.strftime('%Y-%m')),:,:]
空间图使用技巧
1. 空间图自定义colorbar进行绘图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as mcolors
colors = ['#9f0028', '#eb3c39', '#ff7f64', '#fea68e','#ffccc8',
'#84d88a',
'#86b4f0', '#6c88f3', '#0065d7', '#0051d6','#0037a8']
cmap = mcolors.ListedColormap(colors)
def show_cmap(cmap, norm=None, extend=None):
'''展示一个colormap.'''
if norm is None:
norm = mcolors.Normalize(vmin=0, vmax=cmap.N)
im = cm.ScalarMappable(norm=norm, cmap=cmap)
fig, ax = plt.subplots(figsize=(6, 1))
fig.subplots_adjust(bottom=0.5)
fig.colorbar(im, cax=ax, orientation='horizontal', extend=extend)
plt.show()
show_cmap(cmap)