- 积分
- 750
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2018-12-25
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 jl2587t 于 2021-1-31 21:38 编辑
利用windrose绘制风玫瑰图并解决错误问题一、绘制一个风玫瑰图
1.导入所需库
from windrose import WindroseAxes
import matplotlib.pyplot as plt
import matplotlib.cm as cm
2.绘制玫瑰图
axes = WindroseAxes.from_ax()
plt.rcParams['font.sans-serif'] = ['SimHei']#解决中文乱码
wd = [0]#风向0
ws = [2]#风速2
axes.bar(wd, ws, normed=True, opening=0.8, edgecolor='#b5b5c8', cmap = cm.get_cmap(name='bwr'))
axes.set_legend()#添加图例
plt.show()
代码中axes.bar()前两位参数为风向和风速,后面各个参数含义可自行查询文档,意义不大,照作者的抄就可以了
图中可即风玫瑰图,但发现两个问题,第一0°位置没有在正北,第二作者给的风向是0°,但实际却显示在的90°的位置。先解决第一个问题
3.使0°和正北对应
axes = WindroseAxes.from_ax()
plt.rcParams['font.sans-serif'] = ['SimHei']#解决中文乱码
wd = [0]#风向0
ws = [2]#风速2
axes.bar(wd, ws, normed=True, opening=0.8, edgecolor='#b5b5c8', cmap = cm.get_cmap(name='bwr'))
axes.set_theta_zero_location('N')#改变0°位置
axes.set_theta_direction(-1)#改变角度位置
axes.set_legend()#添加图例
plt.show()
4.解决风向与坐标轴不匹配的问题
经作者测试,风向90°会被显示在0°,风向270°会被显示在180°,显示角度和实际风向存在一个沿45°(225°)方向轴对称的情况,所以,对实际风向在画图前做一个预处理。
#角度转化函数
def wind_direction_change(wd):
wind_direction = np.array(wd)
wind_direction[np.where((wind_direction >= 0)&(wind_direction <= 135))[0]] = 90 - wind_direction[np.where((wind_direction >= 0)&(wind_direction <= 135))[0]]
wind_direction[np.where((wind_direction >= 315)&(wind_direction < 360))[0]] = 90 - wind_direction[np.where((wind_direction >= 315)&(wind_direction < 360))[0]]
wind_direction[np.where((wind_direction > 135)&(wind_direction < 315))[0]] = 450 - wind_direction[np.where((wind_direction > 135)&(wind_direction < 315))[0]]
wind_direction[np.where(wind_direction < 0)[0]] = 360 + wind_direction[np.where(wind_direction < 0)[0]]
return wind_direction
自此风玫瑰图的正确画法介绍完毕,下面是作者封装好的函数,大家拿来用就可以了,也可以自己做相应的修改
二、完整代码
from windrose import WindroseAxes
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
#角度预处理函数,用来画准确的风向
def wind_direction_change(wd):
wind_direction = np.array(wd)
wind_direction[np.where((wind_direction >= 0)&(wind_direction <= 135))[0]] = 90 - wind_direction[np.where((wind_direction >= 0)&(wind_direction <= 135))[0]]
wind_direction[np.where((wind_direction >= 315)&(wind_direction < 360))[0]] = 90 - wind_direction[np.where((wind_direction >= 315)&(wind_direction < 360))[0]]
wind_direction[np.where((wind_direction > 135)&(wind_direction < 315))[0]] = 450 - wind_direction[np.where((wind_direction > 135)&(wind_direction < 315))[0]]
wind_direction[np.where(wind_direction < 0)[0]] = 360 + wind_direction[np.where(wind_direction < 0)[0]]
return wind_direction
#画风玫瑰图
def drow_windrose(wd,ws):
axes = WindroseAxes.from_ax()#生成玫瑰图类
plt.rcParams['font.sans-serif'] = ['SimHei']#解决中文乱码
#该循环用于剔除静风C的情况,由于需要从猴年往前剔除,防止列表出错
for i in range(len(wd)-1,-1,-1):
if wd == 'c' and ws == 0:
wd.remove('c')
ws.remove(0)
wd_new = wind_direction_change(wd)#改变角度
axes.bar(wd_new, ws, normed=True, opening=0.8, edgecolor='#b5b5c8', cmap = cm.get_cmap(name='bwr'))#画图
axes.set_theta_zero_location('N')#设置正北
axes.set_theta_direction(-1)#改变显示的角度顺序
axes.set_legend()#添加图例
plt.show()
if __name__ == '__main__':
wind_speed = [6,4,4,3,4,2,6,1,1,2,1,2,1,2,1,1,1,1,0,0,0,1,0,1]
wind_direction = [340,110,90,110,180,130,350,30,230,260,240,240,230,210,200,250,250,230,'c','c','c',100,'c',250]
drow_windrose(wind_direction,wind_speed)
三、风玫瑰图解释
该风玫瑰图以16个方位来画风向,风速用颜色表示,圈刻度代表所占百分比,如图所示东北方向风1-2.8m/s的占比15%左右,2.8-4.6m/s的占比15%左右,这里的占比是指所有风向的占比,所有颜色加起来为100%,东北方向风向总共占比33.3%
向了解更多代码细节的可前往CSDN论坛,小的我做了更详细的描述htps://blog.csdn.net/weixin_42372313/article/details/113478852
|
-
-
风玫瑰图.py
1.97 KB, 下载次数: 30, 下载积分: 金钱 -5
|