爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 25875|回复: 3

[源代码] 利用windrose绘制风玫瑰图并解决错误问题

[复制链接]

新浪微博达人勋

发表于 2021-1-31 21:36:37 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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°的位置。先解决第一个问题
1.png

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()
3.png

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

4.png
自此风玫瑰图的正确画法介绍完毕,下面是作者封装好的函数,大家拿来用就可以了,也可以自己做相应的修改
二、完整代码
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)

5.png
三、风玫瑰图解释
6.png
该风玫瑰图以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

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2021-1-31 21:40:03 | 显示全部楼层
楼主镇楼
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-7-17 18:09:15 | 显示全部楼层
你好,我还是不能解决风向显示对称的问题
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-7-21 19:06:07 | 显示全部楼层
楼主真棒!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表