利⽤Pythonmatplotlib绘制风能玫瑰图
概述
在之前的风资源分析⽂章中,有提到过⽤widrose包来进⾏玫瑰图的绘制,⽬前的可视化绘图包有很多,但是最基础和底层的,本⼈认为还是matplotlib,有时候为了画1-2个图就去安装⼀个包,好⿇烦,我就是个安装软件的渣渣,所以,推⼰及⼈,我也研究了⼀下,matplotlib画玫瑰图的⽅法,废话不多说,开始咯~~~
风能玫瑰图
玫瑰图是⽓象科学专业统计图表,⽤来统计某个地区⼀段时期内风向、风速发⽣频率,⼜分为“风向玫瑰图”和“风速玫瑰图”。本⽂中的玫瑰图是将风速和风向结合在⼀起,画出的风能玫瑰图。
idea社区版和商业版的区别读取数据
读取对应的测风数据,并进⾏数据的基本计算,在matplotlib中画图中没有集成的计算包,所以⼀定要充分了解绘制玫瑰图的原理,将数据通过计算来处理成绘图需要的形式,再进⾏调⽤绘图。
**1、读取数据,**并提取出绘图的风速风向数据,此时的数据是原始风速风向数据。
import pandas as pd
factorizationimport matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
filename=r'E:\python总结\实例数据\matplotlib画玫瑰图\Sta_WLS7-4880-0420-0728.xlsx'
listview刷新列表ad_excel(filename,sheet_name='原始数据')
# 提取绘图的风速风向数据,并进⾏简单的删除空值处理
dt=datat.loc[:,('90m Wind Speed (m/s)','90m Wind Direction (�)')] #提取90m⾼度的风速和风向
dt=dt.dropna() #删除空值
2、进⾏绘图前的数据计算。
程序员代码的网站il(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()
气象python零基础入门教程data=count.unstack() #将层次化索引转化为表格
3、绘制玫瑰图与颜⾊条。
根据上⾯计算的数据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']
lors.ListedColormap(colors)
lors.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轴出现的频数,也可设置为空
lorbar.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_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画玫瑰图的⽤法,另外还有⼀些衍⽣的玫瑰图,⼤家可以据此摸索⼀下。
css文件用什么打开总结
到此这篇关于利⽤Python matplotlib绘制风能玫瑰图的⽂章就介绍到这了,更多相关matplotlib绘制风能玫瑰图内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论