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 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':分别是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'反转箭头。 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.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)。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
ansible-playbook实现自动部署KVM及安装python3的详细教程
这篇文章主要介绍了ansible-playbook实现自动部署KVM及安装python3的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-05-05Python3导入CSV文件的实例(跟Python2有些许的不同)
今天小编就为大家分享一篇Python3导入CSV文件的实例(跟Python2有些许的不同),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-06-06Python中的测试模块unittest和doctest的使用教程
这篇文章主要介绍了Python中的测试模块unittest和doctest的使用教程,本文来自于IBM官方网站技术文档,需要的朋友可以参考下2015-04-04详解Python如何利用pdfplumber提取PDF中的表格
pdfplumber 是一个开源的 python 工具库 ,它可以轻松的获取 PDF 文本内容、标题、表格、尺寸等各种信息,今天来介绍如何使用它来提取 PDF 中的表格,文中通过代码和图片讲解的非常详细,需要的朋友可以参考下2024-04-04
最新评论