当前位置:首页>python>Python | 急流轴

Python | 急流轴

  • 2026-10-26 22:56:15
Python | 急流轴
副热带急流是位于对流层顶的强西风带,风速通常超过30m/s,是天气预报和气候研究中非常重要的系统。它不仅是其他天气系统的重要引导气流,还与我国的降水分布密切相关。
在画急流轴时,按基本逻辑,即逐经度找到纬向风速最大的纬度,进而将其连接起来即可得到急流轴,但是!!!结果可能是下图(来自读到的一篇文献)这样的,显得比较僵硬不丝滑。
其实解决方法很简单,就是用scipy.interpolate里的make_interp_spline进行插值,从而达到平滑的效果!代码如下:
# 导入所需的库import xarray as xrimport numpy as npimport matplotlib.pyplot as pltimport cartopy.crs as ccrsimport cartopy.feature as cfeatureimport cartopy.mpl.ticker as ctickerimport cmapsfrom scipy.interpolate import make_interp_spline# 打开数据集dsu_file = r'E:\SXJ_Pre_data\ERA5_monthly\uwnd_12lev_mon_mean_0.5.nc'dsu = xr.open_dataset(dsu_file)# 筛选时间范围:1979-01-01 至 2020-12-31dsu = dsu.sel(time=slice('1979-01-01', '2020-12-31'))# 选择0-180E和0-90N范围的数据dsu = dsu.sel(longitude=slice(0, 180), latitude=slice(90, 0))# 提取200hPa层次的冬季(1月、2月、3月)风速数据(这里为了方便直接取1-3月,严格冬季为12-2月)u_200 = dsu['u'].loc[dsu.time.dt.month.isin([1, 2, 3])].loc['1979-01-01':'2020-03-31', 200]# 读取经纬度信息lonu = dsu['longitude']latu = dsu['latitude']# 对时间维度求平均u_200_mean = u_200.mean(axis=0)# 绘图部分fig = plt.figure(figsize=(10, 7))# 设置地图投影proj = ccrs.PlateCarree(central_longitude=0)leftlon, rightlon, lowerlat, upperlat = (0, 180, 0, 90)img_extent = [leftlon, rightlon, lowerlat, upperlat]# 创建地图ax1 = fig.add_subplot(111, projection=proj)ax1.set_extent(img_extent, crs=ccrs.PlateCarree())ax1.add_feature(cfeature.COASTLINE.with_scale('110m'), edgecolor='grey')  # 添加海岸线# 设置经纬度刻度ax1.set_xticks(np.arange(leftlon, rightlon + 30, 30), crs=ccrs.PlateCarree())ax1.set_yticks(np.arange(lowerlat, upperlat + 10, 10), 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)plt.tick_params(labelsize=15)# 设置标题ax1.set_title('Clim. U200 ', loc='left', fontdict={'family': 'Times New Roman', 'size': 20})# 绘制风速场c1 = ax1.contourf(lonu, latu, u_200_mean, zorder=0, transform=ccrs.PlateCarree(),                  cmap=cmaps.WhiteYellowOrangeRed, extend='both', levels=np.arange(10, 90, 10))# 设置颜色条colorbar1 = fig.add_axes([ax1.get_position().x0,                          ax1.get_position().y0 - 0.075,                          ax1.get_position().width,                          0.015])cb1 = fig.colorbar(c1, cax=colorbar1, orientation='horizontal', format='%d')cb1.ax.set_title('m/s', fontsize=13, pad=0.05)plt.tick_params(labelsize=15)# 绘制急流轴# 找到每个经度上风速最大的纬度max_speed_lat = u_200_mean.argmax(dim='latitude')x = lonu.valuesy = latu.values[max_speed_lat.values]# 生成平滑曲线model = make_interp_spline(x, y, k=3)  # 三次样条插值x_new = np.linspace(x.min(), x.max(), 20)y_new = model(x_new)# 绘制平滑后的曲线ax1.plot(x_new, y_new, 'k-', lw=4)# 保存图像plt.savefig('drawmap.png', dpi=600, bbox_inches='tight')plt.show()
结果如下,看起来确实舒服一些!

最新文章

随机文章