2021-05-12 14:32:11
利用Python matplotlib繪製風能玫瑰圖
概述
在之前的風資源分析文章中,有提到過用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軸出現的頻數,也可設定為空
得到如下圖:
由於風向資料的特徵很明顯,即主要風向明確,所以圖畫出來不太好看。
以上為matplotlib畫玫瑰圖的用法,另外還有一些衍生的玫瑰圖,大家可以據此摸索一下。
總結
到此這篇關於利用Python matplotlib繪製風能玫瑰圖的文章就介紹到這了,更多相關matplotlib繪製風能玫瑰圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章