• 售前

  • 售后

热门帖子
入门百科

使用Python matplotlib绘制风能玫瑰图

[复制链接]
伊索谗言 显示全部楼层 发表于 2021-10-26 14:03:08 |阅读模式 打印 上一主题 下一主题
概述


在之前的风资源分析文章中,有提到过用widrose包来进行玫瑰图的绘制,目前的可视化绘图包有很多,但是最根本和底层的,本人以为还是matplotlib,有时候为了画1-2个图就去安装一个包,好贫困,我就是个安装软件的渣渣,所以,推己及人,我也研究了一下,matplotlib画玫瑰图的方法,废话不多说,开始咯~~~
风能玫瑰图


玫瑰图是环境科学专业统计图表,用来统计某个地区一段时期内风向、风速发生频率,又分为“风向玫瑰图”和“风速玫瑰图”。本文中的玫瑰图是将风速和风向联合在一起,画出的风能玫瑰图。
读取数据


读取对应的测风数据,并进行数据的根本盘算,在matplotlib中绘图中没有集成的盘算包,所以肯定要充分了解绘制玫瑰图的原理,将数据通过盘算来处理成绘图须要的情势,再进行调用绘图。
**1、读取数据,**并提取出绘图的风速风向数据,此时的数据是原始风速风向数据。
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. import matplotlib as mpl
  5. plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
  6. plt.rcParams['axes.unicode_minus']=False #显示负号
  7. filename=r'E:\python总结\实例数据\matplotlib画玫瑰图\Sta_WLS7-4880-0420-0728.xlsx'
  8. datat=pd.read_excel(filename,sheet_name='原始数据')
  9. datat.columns
  10. # 提取绘图的风速风向数据,并进行简单的删除空值处理
  11. dt=datat.loc[:,('90m Wind Speed (m/s)','90m Wind Direction (�)')] #提取90m高度的风速和风向
  12. dt=dt.dropna() #删除空值
复制代码

2、进行绘图前的数据盘算。
  1. mx=np.ceil(max(dt['90m Wind Speed (m/s)'])) #风速最大值向上取整
  2. ct0=np.array(np.arange(0,361,22.5)) #划分风向的区间,22.5度一个区间
  3. ct1=np.array(np.arange(0,mx+2,2)) #划分风速的区间,2米一个区间
  4. #将风速和风向进行区间划分
  5. dt['wd']=pd.cut(dt['90m Wind Direction (�)'],ct0)
  6. dt['ws']=pd.cut(dt['90m Wind Speed (m/s)'],ct1)
  7. #计算各区间段数据量,输出结果为层次化索引序列
  8. count=dt['90m Wind Speed (m/s)'].groupby([dt['ws'],dt['wd']]).count()
  9. data=count.unstack() #将层次化索引转化为表格
复制代码


3、绘制玫瑰图与颜色条。

根据上面盘算的数据data来进行绘图。
  1. n=16 #绘制的扇区的个数,与上面角度的区间划分一致的
  2. theta=np.linspace(0,2*np.pi,n,endpoint=False) #获取16个方向的角度值
  3. width=np.pi*1.5/n #设置扇形的宽度
  4. #设置角度对应的标签
  5. labels=list(['N','','45','','E','','135','','S','','225','','W','','315',''])
  6. fig=plt.figure() #新建画布
  7. ax=fig.add_axes([0.1,0.1,0.7,0.7],projection='polar') #在画布添加一个极坐标图,即玫瑰图
  8. ax1=fig.add_axes([0.8,0.1,0.03,0.7]) #在画布里面添加颜色条,分别对应左,下,宽,高
  9. #根据划分的风速段个数来进行颜色配置
  10. colors=['blue','orange','forestgreen','tomato','violet','red','m','yellow','gray']
  11. cmap=mpl.colors.ListedColormap(colors)
  12. norm=mpl.colors.BoundaryNorm(ct1,cmap.N)
  13. for i in range(0,len(data.index)):
  14. idx=data.index[i]
  15. rad=data.loc[idx]
  16. #画玫瑰柱状图,由此类推,可以画雷达图,气泡图等等,只要将bar改成对应的图就可以
  17. ax.bar(theta,rad,width=width,bottom=100,label=idx,tick_label=labels,color=colors[i])
  18. ax.set_theta_zero_location('N') #设置0度正北方向
  19. ax.set_theta_direction(-1) #设置顺时针方向绘图
  20. ax.set_title('风玫瑰图',fontsize=16)
  21. ax.tick_params(labelsize=15)
  22. ax.set_yticks([200,500,1000,1500]) #默认的y轴出现的频数,也可设置为空
  23. cb=mpl.colorbar.ColorbarBase(ax1,cmap=cmap,norm=norm) #设置颜色条
  24. cb.ax.tick_params(labelsize=14) #设置颜色条字体和大小
复制代码
得到风玫瑰柱状图如下:

将内里:
  1. ax.bar(theta,rad,width=width,bottom=100,label=idx,tick_label=labels,color=colors[i])
复制代码
更换成:
  1. ax.fill(theta,rad,alpha=0.5,color=colors[i])
复制代码
得到风能面积图,不过由于本次数据覆盖严肃,比较丑:

简朴的风向玫瑰图


在实际运用中,有时候并不须要很复杂的玫瑰图,简朴的表现各风向上的风速出现频次就可以了,因此,可以画简朴的风向玫瑰图。
  1. data_0=dt['90m Wind Speed (m/s)'].groupby(dt['wd']).count() #计算每一个风向段的风速频次
  2. ax=plt.subplot(111,projection='polar') #建立极坐标系
  3. bars=ax.bar(theta,data_0,width=width,bottom=0.0)
  4. #为每个柱子配颜色,有两种方法,一种是一个柱子设置一个颜色,根据柱子的个数设置颜色的个数
  5. #另一种是用连续色彩的映射,第二种方法需要将画图数据归一化到0-1之间
  6. mm=max(data_0)
  7. for r,bar in zip(data_0,bars):
  8. bar.set_facecolor(plt.cm.viridis(r/mm)) #设置数值映射的颜色
  9. bar.set_alpha(0.8) #设置颜色透明度
  10. ax.set_theta_zero_location('N') #设置0度正北方向
  11. ax.set_theta_direction(-1) #设置顺时针方向绘图
  12. ax.set_title('风向玫瑰图',fontsize=16)
  13. ax.tick_params(labelsize=13)
  14. ax.set_yticks([500,1000,2000,4000]) #默认的y轴出现的频数,也可设置为空
复制代码
得到如下图:

由于风向数据的特性很明显,即主要风向明确,所以图画出来不太好看。
以上为matplotlib画玫瑰图的用法,另外另有一些衍生的玫瑰图,大家可以据此摸索一下。

总结

到此这篇关于使用Python matplotlib绘制风能玫瑰图的文章就介绍到这了,更多相干matplotlib绘制风能玫瑰图内容请搜索脚本之家以前的文章或继续欣赏下面的相干文章盼望大家以后多多支持脚本之家!

本帖子中包含更多资源

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

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作