利用windrose绘制风玫瑰图并解决错误问题

利用windrose绘制风玫瑰图并解决错误问题

绘制一个风玫瑰图

导入所需库

from windrose import WindroseAxes
import matplotlib.pyplot as plt
import matplotlib.cm as cm

绘制玫瑰图

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

使0°和正北对应

axes.set_theta_zero_location('N')
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_legend()#添加图例
plt.show()

在这里插入图片描述
图中0°位置以调整完毕
但发现角度沿逆时针方向分部,与我们日常习惯不同

axes.set_theta_direction(-1)

在这里插入图片描述
自此,角度坐标轴调整完毕

解决风向与坐标轴不匹配的问题

经作者测试,风向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
axes = WindroseAxes.from_ax()
plt.rcParams['font.sans-serif'] = ['SimHei']#解决中文乱码
wd = [0]#风向0
ws = [2]#风速2
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()

在这里插入图片描述
自此风玫瑰图的正确画法介绍完毕,下面是作者封装好的函数,大家拿来用就可以了,也可以自己做相应的修改

完整代码

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[i] == 'c' and ws[i] == 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%

猜你喜欢

转载自blog.csdn.net/weixin_42372313/article/details/113478852