python画风羽及风羽定义

9 篇文章 4 订阅
4 篇文章 0 订阅

basemap使用手册:链接:https://pan.baidu.com/s/1CUgQcsuYMbJAdCuij4WsLQ 
提取码:aw16 

如果想用箭头画风场,请看另一篇python matplotlib quiver——画箭头、风场

首先说下风羽是怎么回事:

当我们表示风向的时候,我们当然可以用简单的箭头指示即可,但箭头不能表示出风速的信息。为了简单而有效的表达出风的大小和方向,于是就创造了风羽——一个相对紧凑的图形(当然也许可以创造出更好地表示方法,但风羽先被广泛接受)。怎么来解读一个风羽呢?参看下图:

上图中长杆代表风向,短杆和小旗子代表风速。

短杆的朝向:设想你站在风速羽长杆上,末端是短杆所在一侧,你面对短杆,那么北半球画风羽,短杆在你的右侧,南半球画风羽,短杆则画在左侧,这是一种惯例。

国外:长杆代表风向,短杆代表风速,每个短杆为10knots,如果是半个短杆,则为5knots(1knot=1节=0.514m/s)
国内:长杆代表风向,短杆代表风速,每个短杆为4m/s,如果是半个短杆,则为2m/s。(1m/s=1.94knots)
(好吧,我认为这个换算单位很烦,英美仍然用着他们的英里什么的,在风速这里实际上是用的海里,海里的话当然为了当时的方便,现在沿用这些,感觉没必要,公制万岁!)

那测量风向的时候(我得到的数据就是一个角度),记录的就是风的来向,0°应该是正北来风,90°正东来风,以此类推。

参考:

https://baike.baidu.com/item/%E9%A3%8E%E9%80%9F%E7%BE%BD/5018668

http://weather.rap.ucar.edu/info/about_windbarb.html

其次说说python中怎么画风羽:

参考:

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.barbs.html

https://www.cnblogs.com/kallan/p/6279932.html

风羽函数:

barb(X, Y, U, V,, **kw)

barbs的参数:

X:风场数据X坐标
Y:风场数据Y坐标
U:风的水平方向分量
V:风的垂直方向分量

这里水平分量和垂直分量值得商榷,就是你的角度数据所在坐标系与函数中的不一样,有时会产生结果与你的预期不正确的情况。

实操

首先看以下代码:

import matplotlib.pyplot as plt
import math

ax = plt.subplot(1,1,1)
wind = [100,100,100,100]
angle = [45, 135, 225, 315]
a = range(1,5)
b = range(1,5)

ver = [spd*math.sin(math.radians(agl)) for spd,agl in zip(wind, angle)]  #vertical value
hriz = [spd*math.cos(math.radians(agl)) for spd,agl in zip(wind, angle)]  #horizontal value
ax.barbs(a, b, ver, hriz)
plt.show()

得到如下结果:

这不太对,我说结果不太对,是方向的问题。根据前面对风羽的介绍,45°那里的结果是西南来风,但是45°应该是东北来风啊,所以说他错了,另外几个亦复如是。我的风向是罗盘坐标系下的角度,就是上图fig a的坐标系,函数的坐标系我没找到。改的结果也很简单,试了一下,就是将水平和垂直分量的值变成其相反数,得到预期结果:

import matplotlib.pyplot as plt
import math

ax = plt.subplot(1,1,1)
wind = [100,100,100,100]
angle = [45, 135, 225, 315]
a = range(1,5)
b = range(1,5)

ver = [-spd*math.sin(math.radians(agl)) for spd,agl in zip(wind, angle)]  #vertical value
hriz = [-spd*math.cos(math.radians(agl)) for spd,agl in zip(wind, angle)]  #horizontal value
ax.barbs(a, b, ver, hriz)
plt.show()

结果如下:

此外,如果您想在地图上画出风羽,借助basemap,实现代码如下:

import matplotlib.pyplot as plt
import math
from mpl_toolkits.basemap import Basemap

ax = plt.gca()
wind = [100,100,100,100]
angle = [45, 135, 225, 315]
a = [113.9, 114.1, 114.3, 114.5]
b = [22.5, 22.6, 22.7, 22.8]
m = Basemap(llcrnrlon=113.7, llcrnrlat=22.35, urcrnrlon=114.7, urcrnrlat=22.9,\
            rsphere=(6378137.00,6356752.3142),\
            resolution='l', area_thresh=1000., projection='lcc', lat_1=22.5, lat_0=22.5, lon_0=114,ax=ax)
#下面两行是读取地图中的shape文件,即轮廓图
m.readshapefile(r'G:\深圳季风研究\gadm36_HKG_shp\gadm36_HKG_0', 'states',color='grey') #HongKong
m.readshapefile(r'G:\深圳季风研究\gadm36_CHN_shp\gadm36_CHN_2', 'states',color='grey') #Mainland in given lon and lat
a1,b1=m(*(a,b))  #这里将经纬度坐标转化成像素点坐标

ver = [-spd*math.sin(math.radians(agl)) for spd,agl in zip(wind, angle)]
hriz = [-spd*math.cos(math.radians(agl)) for spd,agl in zip(wind, angle)]

ax.barbs(a1,b1,ver,hriz)
plt.show()

结果如下:

注意:

关于风羽的风速,ax.barbs()中当风速在(0,2.5)时,认为无风画一圆圈,在(2.5,7.5)为一短杆。

关于颜色等问题,可以自行参考官方文档或百度之

  • 15
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
要在Python画风羽图,可以使用matplotlib库的quiver函数。首先,你需要导入matplotlib库和numpy库(用于生成数据)。然后,你可以使用quiver函数来创建风羽图。 下面是一些简单的步骤来画风羽图: 1. 导入必要的库: ```python import matplotlib.pyplot as plt import numpy as np ``` 2. 创建一些示例数据来表示风速和风向: ```python speed = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 风速 direction = np.array([[0, 45, 90], [135, 180, 225], [270, 315, 360]]) # 风向 ``` 3. 创建一个坐标轴对象: ```python fig, ax = plt.subplots() ``` 4. 使用quiver函数来绘制风羽图: ```python ax.quiver(direction, speed) ``` 5. 设置坐标轴的标签和标题: ```python ax.set_xlabel('Direction') ax.set_ylabel('Speed') ax.set_title('Wind Barb') ``` 6. 显示图形: ```python plt.show() ``` 这样就可以使用Python绘制风羽图了。你可以根据自己的需要修改示例数据和其他参数来绘制不同的风羽图。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python画风羽及风羽定义](https://blog.csdn.net/liuchengzimozigreat/article/details/82782721)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值