使用python绘制全球的风场主要用到matplotlib包中:
quiver()
函数,具体参数设置可以查看官网。
数据来源于ERA5的月均10m风矢量资料:ERA5
为了提高运行效率,我将数据重新插值,分辨率为:2.5°x2.5°
下面举个例子进行演示,我只选取2020年的数据,绘制全球范围内,每个月的数据资料,填色为风速大小。
代码很简单,核心代码只有下面一句:
cb=ax.quiver(x[::5,::5],y[::5,::5],u.data[i,:,:][::5,::5],v.data[i,:,:][::5,::5],pivot='mid',\ width=0.0018,scale=300,transform=ccrs.PlateCarree(),color='k',angles='xy',zorder=1)
需要注意的是,x、y是二维的,也就是需要将读取的经纬度进行np.meshgrid()处理,同时为了绘制的箭头美观,间隔明显,每5个为间隔进行绘制,其他一些设置就是调整箭头长度、宽度、比例、颜色等等,可以根据图像美观设置。
绘制结果如下所示:
下面是全部代码:
# -*- coding: utf-8 -*- """ Created on %(date)s @author: %(jixianpu)s introduction : keep learning althongh walk slowly """ import cartopy.mpl.ticker as cticker import xarray as xr import numpy as np import matplotlib.pyplot as plt from cartopy.mpl.ticker import LongitudeFormatter ,LatitudeFormatter import cartopy.crs as ccrs import cartopy.feature as cfeature p=r'D:/data.nc' data=xr.open_dataset(p).sel(time=slice("2020","2020")) u=data.u10 v=data.v10 w=np.sqrt(u*u+v*v) lon=data.lon.data lat=data.lat.data def make_map(ax, title,box,xstep,ystep): # set_extent set crs ax.set_extent(box, crs=ccrs.PlateCarree()) ax.coastlines(scale) # set coastline resolution # set coordinate axis ax.set_xticks(np.arange(box[0], box[1], xstep),crs=ccrs.PlateCarree()) ax.set_yticks(np.arange(box[2], box[3], ystep),crs=ccrs.PlateCarree()) ax.xaxis.set_major_formatter(cticker.LongitudeFormatter()) #经度0不加标识 ax.yaxis.set_major_formatter(cticker.LatitudeFormatter()) ax.set_title(title, fontsize=15, loc='center') return ax fig=plt.figure(figsize=(30,25)) x,y=np.meshgrid(lon,lat) box1 = [0, 361, -90, 91] scale = '50m' xstep, ystep = 10, 10 cmap=plt.get_cmap('Reds')#'RdYlBu_r' titl=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sept','Oct','Nov','Dec'] for i in range(12): print(i) proj=ccrs.PlateCarree(central_longitude=180) ax=fig.add_subplot(4,3,i+1,projection=proj) make_map(ax,str(titl[i]),box1,45,45) cb=ax.quiver(x[::5,::5],y[::5,::5],u.data[i,:,:][::5,::5],v.data[i,:,:][::5,::5],pivot='mid',\ width=0.0018,scale=300,transform=ccrs.PlateCarree(),color='k',angles='xy',zorder=1) cp=ax.contourf(lon,lat,w.data[i],zorder=0,transform=ccrs.PlateCarree(),cmap=cmap,levels=np.arange(0,21,2),extend='both') plt.show()
一个努力学习python的海洋人 水平有限,欢迎指正!!! 欢迎评论、收藏、点赞、转发、关注。 关注我不后悔,记录学习进步的过程~~