利用Python matplotlib绘制风能玫瑰图
作者:加油学习和努力赚钱的猪妈咪 发布时间:2023-10-12 23:07:24
概述
在之前的风资源分析文章中,有提到过用widrose包来进行玫瑰图的绘制,目前的可视化绘图包有很多,但是最基础和底层的,本人认为还是matplotlib,有时候为了画1-2个图就去安装一个包,好麻烦,我就是个安装软件的渣渣,所以,推己及人,我也研究了一下,matplotlib画玫瑰图的方法,废话不多说,开始咯~~~
风能玫瑰图
玫瑰图是气象科学专业统计图表,用来统计某个地区一段时期内风向、风速发生频率,又分为“风向玫瑰图”和“风速玫瑰图”。本文中的玫瑰图是将风速和风向结合在一起,画出的风能玫瑰图。
读取数据
读取对应的测风数据,并进行数据的基本计算,在matplotlib中画图中没有集成的计算包,所以一定要充分了解绘制玫瑰图的原理,将数据通过计算来处理成绘图需要的形式,再进行调用绘图。
**1、读取数据,**并提取出绘图的风速风向数据,此时的数据是原始风速风向数据。
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() #删除空值
2、进行绘图前的数据计算。
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() #将层次化索引转化为表格
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']
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轴出现的频数,也可设置为空
得到如下图:
由于风向数据的特征很明显,即主要风向明确,所以图画出来不太好看。
来源:https://blog.csdn.net/zhumengxia/article/details/114916834


猜你喜欢
- 继上篇博客Python实现简易通讯录后,我就想写一个复杂点的学生信息管理系统,这次实现的功能有1.学生信息的录入管理;2.学生选课操作;3.
- 最近听说一个很好玩的图灵机器人api,正好可以用它做一个微信聊天机器人,下面是实现# test.pyimport requestsimpor
- pycharm全局修改pycharm 全局改函数方法1ctrl shift r全局替换方法2点击函数,右键 Refactor Ch
- 代码如下:CREATE DATABASE 临时的 ON ( NAME='临时的_Data', FILENAME='h
- 1、唠唠叨叨最近项目中需要Python的打包,看到网上也没有很详细的资料,于是做了一些示例程序。小小的研究了一下,Python如何在Wind
- python版本: 3.6pandas版本: 0.23.4行索引索引行有三种方法,分别是 loc iloc iximport pandas
- 1. pyecharts 模块介绍Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。
- 这篇文章主要介绍了Python argparse模块使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 1、使用索引来更快地遍历表。缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索
- 任务详情给定一各地 2016 年 1 月和 2 月各个时间点的温度表格,表格预览见页面下方。数据表的第二列表示当前时间,数据表第一行第三列到
- 第一步、下载压缩包下载社区版的 MySQL,根据需求下载对应版本,其中有最小安装版本。具体各个版本的区别,可以上网查询,链接MySQL ::
- 1.前言 &n
- 类似如下: select A.key,B.key,C.key from A,B,C where trim(A.key)=trim(B.fk)
- 问题今天在写项目功能的时候,有一个统计金额的情况,然后需要进行单位转换,所以写下了大概如下功能的语句,但得到的数据为小数点后4位精度,正常我
- 使用ajax获取服务器数据返回给客户端,出现中文乱码。在之前的一个ajax应用中指定codepage=936,将所有页面编码都指定为GB23
- PyTorch基础入门二:PyTorch搭建一维线性回归模型1)一维线性回归模型的理论基础给定数据集,线性回归希望能够优化出一个好的函数,使
- Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决:第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事
- 虽然有些人认为区块链是一个早晚会出现问题的解决方案,但是毫无疑问,这个创新技术是一个计算机技术上的奇迹。那么,究竟什么是区块链呢?区块链以比
- 本文是 《用 Golang 实现一个 Redis》系列文章第二篇,本文将分别介绍Redis 通信协议 以及 协议解析器 的实现,若您对协议有
- 这本来是翻译Estelle Weyl的《15 JavaScript Gotchas》,里面介绍的都是在JavaScript编程实践中平时容易