在处理nc文件的过程中,有时需要对nc文件的数据在时间、经度、纬度进行裁剪处理,提取出自己感兴趣的部分。这就需要用到掩膜mask等处理手段,针对不同的结果有不同的方法进行处理。本文利用ERA5月平均数据,裁剪青藏高原范围的nc文件,并绘制空间分布图。
代码如下(示例):
import warnings
warnings.filterwarnings("ignore")
import cartopy.crs as ccrs
import pandas as pd
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.mpl.ticker as cticker
from cartopy.io.shapereader import Reader
import cmaps
data1=xr.open_dataset('E:/CORDEX-TP/DATA/ERA-1981-2015-T-P.nc')
tas01=data1.t2m
tas01=tas01[:,::-1,:]-273.15
lon = np.arange(69.75, 140.5, 0.25)
lat = np.arange(14.75, 55.5, 0.25)
代码如下(示例):
import geopandas as gpd
import salem
shp = "E:/shapefile/青藏高原/青藏高原边界数据总集/TPBoundary_new(2021)/TPBoundary_new(2021).shp"
# 创造掩膜数据
tp_shp=gpd.read_file(shp)
tas01_tp=tas01.salem.roi(shape=tp_shp)
print(tas01_tp)
tas01_tp=tas01_tp.mean(dim='time')
leftlon, rightlon, lowerlat, upperlat = (67,105,24,38)
img_extent = [leftlon, rightlon, lowerlat, upperlat]
clevels=np.arange(-20,24,4)
fig = plt.figure(figsize=(16,16),dpi=300)
ax1=fig.add_subplot(111,projection = ccrs.PlateCarree())
ax1.set_extent(img_extent, crs=ccrs.PlateCarree())
ax1.set_xticks(np.arange(leftlon,rightlon+spec1,spec1), crs=ccrs.PlateCarree())
ax1.set_yticks(np.arange(lowerlat,upperlat+spec2,spec2), crs=ccrs.PlateCarree())
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
ax1.xaxis.set_major_formatter(lon_formatter)
ax1.yaxis.set_major_formatter(lat_formatter)
ax1.tick_params(labelsize=10)
labels = ax1.get_xticklabels() + ax1.get_yticklabels()
[label.set_fontname('Arial') for label in labels]
ac=ax1.contourf(lon,lat, tas01_tp,clevels,cmap=cmaps.temp_19lev,
extend = 'both', transform=ccrs.PlateCarree() )
ax1.tick_params(labelsize=14)
ax1.add_geometries(Reader('E:/shapefile/青藏高原/青藏高原边界数据总集/TPBoundary_new(2021)/TPBoundary_new(2021).shp').geometries(),
crs=ccrs.PlateCarree(), facecolor='none',edgecolor='k',linewidth=1)
ax1.set_ylabel('CN05',fontsize=18)
position2=fig.add_axes([0.2, 0.2, 0.6, 0.018])#位置[左,下,右,上] 0.25, 0.35, 0.5, 0.014
cb=plt.colorbar(ac,cax=position2,orientation='horizontal',shrink=0.75,aspect=20,fraction=.03,pad=0.02)#方向
cb.set_ticks(np.arange(-20,24,4)) #设置colorbar范围和刻度标记间隔
position2.set_title('℃',loc = 'right',fontsize=14,weight = 'normal')
cb.ax.tick_params(labelsize=8, direction='in', right=False)