使用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)sintroduction : keep learning althongh walk slowly"""import cartopy.mpl.ticker as ctickerimport xarray as xrimport numpy as npimport matplotlib.pyplot as pltfrom cartopy.mpl.ticker import LongitudeFormatter ,LatitudeFormatterimport cartopy.crs as ccrsimport cartopy.feature as cfeaturep=r'D:/data.nc'data=xr.open_dataset(p).sel(time=slice("2020","2020"))u=data.u10v=data.v10w=np.sqrt(u*u+v*v)lon=data.lon.datalat=data.lat.datadef 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 axfig=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的海洋人 水平有限,欢迎指正!!! 欢迎评论、收藏、点赞、转发、关注。 关注我不后悔,记录学习进步的过程~~