使用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个为间隔进行绘制,其他一些设置就是调整箭头长度、宽度、比例、颜色等等,可以根据图像美观设置。 绘制结果如下所示:
下面是全部代码:
"""
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):
ax.set_extent(box, crs=ccrs.PlateCarree())
ax.coastlines(scale)
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())
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')
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的海洋人
水平有限,欢迎指正!!!
欢迎评论、收藏、点赞、转发、关注。
关注我不后悔,记录学习进步的过程~~
|