最近需要根据再分析资料的U风和V风分析背景场的风场走向和大小,需要在地图上绘制风场箭头。

先看一下结果:

在这里插入图片描述
长度代表风速大小,箭头指向代表风向。绘制的经纬度区间由计算的经纬度数组决定。

一、python调用quiver绘制风场箭头

风场主要是用箭头表示风的方向和大小,python中调用的方法为:

Axes.quiver(*args, data=None, **kw)

调用quivers的形式:

quiver(X, Y, U, V, C, **kw)

X、Y是箭头的位置,U、V是箭头数据(data),C是箭头的颜色。

如果X、Y不存在(absent),他们将作为均匀网格被生成。

默认设置会自动将箭头的长度缩放到合理的大小。要改变箭头的长度请参看 scale 和scale_units两个关键字参数。

quiver函数的参数:

X: 1D or 2D array, sequence, optional 1维或2维数组,序列(sequence),可自选(optional),箭头位置的x坐标
Y: 1D or 2D array, sequence, optional 1维或2维数组,序列,可自选,箭头位置的y坐标
U: 1D or 2D array or masked array, sequence 1维或2维数组或掩码数组(参看masked array https://blog.csdn.net/liukai2918/article/details/78419302),序列,箭头矢量的x分量
V: 1D or 2D array or masked array, sequence 1维或2维数组或掩码数组,序列,箭头矢量的y分量
C: 1D or 2D array, sequence, optional 1维或2维数组,序列(sequence),可自选,箭头颜色
units(单位): [ 'width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy' ]
   箭头尺寸(除长度外)以此单位的倍数计算——即是说选定单位后,箭头尺寸即是此单位的倍数
   ‘width’或’height’:轴(axis)的宽度或高度
   ‘dots’或’inches’:像素或英寸,基于图的dpi
   ‘x’, ‘y’或‘xy’:分别是XY或X2+Y2的数据单位(data units)
   箭头依单位不同而不同。对于’x’或’y’,箭头会随着其一的增大(zoom in)而增大;对于其他单位,箭头的大小与缩放状态(zoom state)无关。对于’width’或’height’,当窗口重置时,箭头的大小会随着轴(axes)的宽度和高度的增大而增大;低于同意’dots’或’inches’。重置不会改变箭头。
angles: [‘uv’ | ‘xy’], array, 可自选
   用于决定箭头角度的方法,默认是’uv’
   ‘uv’:箭头的纵横比(axis aspect ratio)为1,所以若U*==*V,则绘图上箭头的方向与水平轴逆时针呈45度(正向右)。
   ‘xy’: 箭头从(x,y)指向(x + u,y + v)。例如,使用它来绘制渐变场(gradient field)。
   或者,可以将任意角度指定为以水平轴逆时针方向的度数值的数组。
   注意:反转数据轴将相应地仅使用angles='xy'反转箭头。
scale : None, float, optional
   每个箭头长度单位的数据单位数量,例如,每个绘图宽度m / s;参数scale越小箭头越长。默认是None
   若是None,一个简单的自动缩放算法将被采用,基于平均矢量长度和适量的数量。箭头长度单位由scale_units参数给出。
width : scalar(标量), optional
   箭杆(shaft)的宽度,以箭头单位衡量。默认是由以上单位的选择和矢量数量来决定。常用的初始值是0.005倍的画的宽度(width of the plot)
headwidth : scalar, optional 头部宽度相对于箭杆宽度的倍数,默认是3倍
headlength : scalar, optional 轴交叉处的头部长度,默认是4.5

matplotlib绘制图像的官方网站介绍。

二、python在地图上绘制风场

1. 数据准备
quiver(X, Y, U, V, C, **kw)

X:经度,这里使用一维数组
Y:纬度,这里使用一维数组
U:U风,根据经纬度从数据集中提取的U风,一维数组
V:V风,根据经纬度从数据集中提取的V风,一维数组
C:颜色,随便设置
width:0.005
scale:200 设置箭头比例,可以自行调节尝试
headwidth:2

m.quiver(x, y, u_wind, v_wind, color='deepskyblue', width=0.005, scale=200, headwidth=2)

经纬度设置:

# 用两个列表存储研究区域的经纬度,这里取正负5°的区间。
lonlist = []
latlist = []
for k in np.linspace(appro_lat - 5, appro_lat + 5, 21):
    for i in np.linspace(appro_lon - 5, appro_lon + 5, 21):
        lonlist.append(i)
        latlist.append(k)

U,V风提取:

u_wind = []
v_wind = []
for i in range(len(lonlist)):
    u_wind.append(nc_obj.variables['u10'][time_index][latitude.index(latlist[i])][longitude.index(lonlist[i])])
    v_wind.append(nc_obj.variables['v10'][time_index][latitude.index(latlist[i])][longitude.index(lonlist[i])])

这里都是用一维数组表示,具体的情况将根据自己的需要设置。

2. 在地图上绘制风场箭头
fig = plt.figure(figsize=(8, 6))
m = Basemap(projection='cyl', llcrnrlat=min(latlist), llcrnrlon=min(lonlist), urcrnrlat=max(latlist),
            urcrnrlon=max(lonlist))  # 使用Basemap获取地图
# 通过readshapefile读取地图文件shp
m.readshapefile(CN_pro', 'states')  // 根据自己的需要readshapefile读取地图文件
m.drawcoastlines(color='black')
m.drawstates(color='black')
m.drawcountries(color='black')
x, y = m(*(lonlist, latlist))  # 将lats / lons转换为地图投影坐标
m.drawmeridians(np.arange(math.ceil(min(lonlist)), int(max(lonlist)), 5), labels=[0, 0, 0, 1])
m.drawparallels(np.arange(math.ceil(min(latlist)), int(max(latlist)), 5), labels=[1, 0, 0, 0])
# 在地图上绘制BestTrack的经纬度
best_lon, best_lat = m(lon[t], lat[t])
# 在地图上绘制点
m.plot(best_lon, best_lat, 'o', color='red', ms=5)
# 绘制风场箭头
m.quiver(x, y, u_wind, v_wind, color='deepskyblue', width=0.005, scale=200, headwidth=2)
plt.show()

需要在地图上绘制卫星云图亮温值请参考:python绘制登陆时的卫星云图(TBB)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐