Python matplotlib绘制风能玫瑰图:从柱状到面积图的实现

晚来风
晚来风
发布时间:2026-10-14| 1人浏览过
原创

本文详细介绍如何使用Python的matplotlib库绘制风能玫瑰图。内容涵盖从原始测风数据读取、风速风向区间划分、频次统计到最终可视化的完整流程。重点讲解了将默认柱状图替换为面积图(fill)的方法,以及简化版风向玫瑰图的绘制技巧,帮助开发者掌握底层绘图逻辑,避免依赖第三方专用包。

概述

在以往的风资源分析讨论中,曾提及使用widrose包来绘制玫瑰图。尽管目前市面上存在众多可视化绘图库,但matplotlib作为最基础且底层的工具,其重要性不言而喻。有时为了绘制一两个简单的图表就安装一个专用包显得过于繁琐,尤其是对于不熟悉环境配置的用户而言。因此,深入探究利用matplotlib直接绘制玫瑰图的方法显得尤为必要。本文将跳过冗长的背景介绍,直接进入核心实现环节。

风能玫瑰图

玫瑰图是气象科学中用于统计特定区域在一段时间内风向和风速发生频率的专业图表,通常分为“风向玫瑰图”和“风速玫瑰图”。本文所讨论的风能玫瑰图,则是将风速与风向两个维度结合,综合展示风能分布情况的图形。

读取数据

首先需要读取相应的测风数据,并执行基础的数据计算。由于matplotlib库中并未集成直接生成玫瑰图的专用计算模块,因此必须透彻理解玫瑰图的绘制原理。这意味着需要先将原始数据通过计算转化为绘图所需的格式,然后再调用绘图函数进行渲染。

第一步是读取数据,并提取出用于绘图的风速和风向信息。此时获取的数据仍为原始的风速和风向记录。


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
plt.rcParams['axes.unicode_minus']=False #显示负号

filename=r'E:\python总结\实例数据\matplotlib画玫瑰图\Sta_WLS7-4880-0420-0728.xlsx'
datat=pd.read_excel(filename,sheet_name='原始数据')
datat.columns

# 提取绘图的风速风向数据,并进行简单的删除空值处理
dt=datat.loc[:,('90m Wind Speed (m/s)','90m Wind Direction (�)')] #提取90m高度的风速和风向
dt=dt.dropna() #删除空值

第二步是在绘图前进行必要的数据计算与预处理。


mx=np.ceil(max(dt['90m Wind Speed (m/s)'])) #风速最大值向上取整

ct0=np.array(np.arange(0,361,22.5)) #划分风向的区间,22.5度一个区间
ct1=np.array(np.arange(0,mx+2,2)) #划分风速的区间,2米一个区间

#将风速和风向进行区间划分
dt['wd']=pd.cut(dt['90m Wind Direction (�)'],ct0) 
dt['ws']=pd.cut(dt['90m Wind Speed (m/s)'],ct1) 

#计算各区间段数据量,输出结果为层次化索引序列
count=dt['90m Wind Speed (m/s)'].groupby([dt['ws'],dt['wd']]).count() 
data=count.unstack() #将层次化索引转化为表格

第三步是绘制玫瑰图并添加颜色条以辅助解读。

基于上述计算得到的data数据,即可开始绘图过程。


n=16 #绘制的扇区的个数,与上面角度的区间划分一致的
theta=np.linspace(0,2*np.pi,n,endpoint=False) #获取16个方向的角度值
width=np.pi*1.5/n #设置扇形的宽度
#设置角度对应的标签
labels=list(['N','','45','','E','','135','','S','','225','','W','','315',''])

fig=plt.figure() #新建画布
ax=fig.add_axes([0.1,0.1,0.7,0.7],projection='polar') #在画布添加一个极坐标图,即玫瑰图
ax1=fig.add_axes([0.8,0.1,0.03,0.7]) #在画布里面添加颜色条,分别对应左,下,宽,高

#根据划分的风速段个数来进行颜色配置
colors=['blue','orange','forestgreen','tomato','violet','red','m','yellow','gray'] 
cmap=mpl.colors.ListedColormap(colors)
norm=mpl.colors.BoundaryNorm(ct1,cmap.N)

for i in range(0,len(data.index)):
 idx=data.index[i]
 rad=data.loc[idx]
 #画玫瑰柱状图,由此类推,可以画雷达图,气泡图等等,只要将bar改成对应的图就可以
 ax.bar(theta,rad,width=width,bottom=100,label=idx,tick_label=labels,color=colors[i]) 
 
ax.set_theta_zero_location('N') #设置0度正北方向
ax.set_theta_direction(-1) #设置顺时针方向绘图
ax.set_title('风玫瑰图',fontsize=16)
ax.tick_params(labelsize=15) 
ax.set_yticks([200,500,1000,1500]) #默认的y轴出现的频数,也可设置为空
cb=mpl.colorbar.ColorbarBase(ax1,cmap=cmap,norm=norm) #设置颜色条
cb.ax.tick_params(labelsize=14) #设置颜色条字体和大小

最终生成的风玫瑰柱状图效果如下所示。

若希望调整图表样式,可以修改绘图代码中的关键参数。

原代码片段为:ax.bar(theta,rad,width=width,bottom=100,label=idx,tick_label=labels,color=colors[i])

将其替换为以下代码:

ax.fill(theta,rad,alpha=0.5,color=colors[i])

替换后即可得到风能面积图。需要注意的是,由于本次示例数据覆盖范围较广且存在重叠,图表视觉效果可能略显杂乱。

简单的风向玫瑰图

在实际应用场景中,有时并不需要过于复杂的风能玫瑰图,只需简单展示各风向下的风速出现频次即可。因此,可以绘制简化版的风向玫瑰图。


data_0=dt['90m Wind Speed (m/s)'].groupby(dt['wd']).count() #计算每一个风向段的风速频次

ax=plt.subplot(111,projection='polar') #建立极坐标系
bars=ax.bar(theta,data_0,width=width,bottom=0.0)

#为每个柱子配颜色,有两种方法,一种是一个柱子设置一个颜色,根据柱子的个数设置颜色的个数
#另一种是用连续色彩的映射,第二种方法需要将画图数据归一化到0-1之间
mm=max(data_0)
for r,bar in zip(data_0,bars):
 bar.set_facecolor(plt.cm.viridis(r/mm)) #设置数值映射的颜色
 bar.set_alpha(0.8) #设置颜色透明度
 
ax.set_theta_zero_location('N') #设置0度正北方向
ax.set_theta_direction(-1) #设置顺时针方向绘图
ax.set_title('风向玫瑰图',fontsize=16)
ax.tick_params(labelsize=13) 
ax.set_yticks([500,1000,2000,4000]) #默认的y轴出现的频数,也可设置为空

简化版风向玫瑰图的绘制效果如下。

由于该示例数据的风向特征非常显著,主要风向明确集中,导致绘制出的图表在视觉上可能不够美观。

以上介绍了利用matplotlib绘制玫瑰图的基本方法。此外,还存在多种衍生类型的玫瑰图,读者可基于本文提供的思路进一步探索和实践。

总结

至此,关于利用Python matplotlib绘制风能玫瑰图的教程已介绍完毕。如需了解更多相关matplotlib绘制风能玫瑰图的内容,建议搜索本站历史文章或继续阅读后续相关文章,感谢大家的支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。