python绘制风场方向和大小quiver问题

 更新时间:2023年08月16日 10:55:51   作者:小朱小朱绝不服输  
这篇文章主要介绍了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

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)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python爬虫实现中英翻译词典

    python爬虫实现中英翻译词典

    这篇文章主要为大家详细介绍了python爬虫实现中英翻译词典,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • python实现大文本文件分割

    python实现大文本文件分割

    这篇文章主要为大家详细介绍了python实现大文本文件分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python时间序列处理之ARIMA模型的使用讲解

    Python时间序列处理之ARIMA模型的使用讲解

    今天小编就为大家分享一篇关于Python时间序列处理之ARIMA模型的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • python 返回一个列表中第二大的数方法

    python 返回一个列表中第二大的数方法

    今天小编就为大家分享一篇python 返回一个列表中第二大的数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python3将视频流保存为本地视频文件

    python3将视频流保存为本地视频文件

    这篇文章主要为大家详细介绍了python3将视频流保存为本地视频文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 在Ubuntu中安装并配置Pycharm教程的实现方法

    在Ubuntu中安装并配置Pycharm教程的实现方法

    这篇文章主要介绍了在Ubuntu中安装并配置Pycharm教程的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python+Pygame实现海洋之神大冒险游戏

    Python+Pygame实现海洋之神大冒险游戏

    这篇文章主要介绍了如何利用Python+Pygame自制一个海洋之神大冒险游戏。规则是在海里收集鱼骨头,有些鱼骨头可以转化为武器,用来攻击敌人,感兴趣的可以了解一下
    2022-08-08
  • 使用TensorFlow搭建一个全连接神经网络教程

    使用TensorFlow搭建一个全连接神经网络教程

    今天小编就为大家分享一篇使用TensorFlow搭建一个全连接神经网络教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python数组过滤实现方法

    python数组过滤实现方法

    这篇文章主要介绍了python数组过滤实现方法,涉及Python针对数组的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Django之第三方平台QQ授权登录的实现

    Django之第三方平台QQ授权登录的实现

    本文主要介绍了Django之第三方平台QQ授权登录的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论