python绘制风场⽅向和⼤⼩quiver
最近需要根据再分析资料的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 blog.csdn/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’:分别是X、Y或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'反转箭头。
python获取数组长度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
⼆、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.drawcoastlines(color='black')
m.drawstates(color='black')
m.drawcountries(color='black')
x, y =m(*(lonlist, latlist)) # 将lats / lons转换为地图投影坐标
m.drawmeridians(np.il(min(lonlist)),int(max(lonlist)),5), labels=[0,0,0,1]) m.drawparallels(np.il(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()
需要在地图上绘制卫星云图亮温值请参考:。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论