『壹』 python氣象繪圖windrose
#導入包
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib.ticker import FuncFormatter
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] #設置簡黑字體
mpl.rcParams['axes.unicode_minus'] = False #設置負號正常顯示
#----獲取數據DataFrames,index*columns。index表示不同值范圍,columns表示十六個風向
data = pd.DataFrame(wind_d_max_num_per,
index=['<15', '15~25', '25~35', '35~45',"≥45"],
columns='N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW'.split())
N = 16 # 風速分布為16個方向
theta = np.linspace(0, 2*np.pi, N, endpoint=False) # 獲取16個方向的如手角度值
width = np.pi / 4 * 0.4 # 繪制扇型的寬度,可以自行調整0.5時是360,充滿,有間隔的話小於0.5即可
labels = list(data.columns) # 自定義坐標標簽為 N , NSN, …渣笑嫌…# 開始繪圖
plt.figure(figsize=(6,6),dpi=600)
ax = plt.subplot(111, projection='polar')
#----自定義顏色
mycolor =['cornflowerblue','orange','mediumseagreen','lightcoral','cyan']
#----循環畫風玫瑰圖
i=0
for idx in data.index:
print(idx)
# 每一行繪制一個扇形
radii = data.loc[idx] # 每一行數據
if i == 0:
ax.bar(theta, radii, width=width, bottom=0.0, label=idx, tick_label=labels,
color=mycolor[i])
else:
ax.bar(theta, radii, width=width, bottom=np.sum(data.loc[data.index[0:i]]), label=idx, tick_label=labels,
color=mycolor[i])
i=i+1
#此種畫法,注意bottom設置,第一個bottom為0,後續bottom需要在前一個基礎上增加。
ax.set_xticks(theta)
ax.set_xticklabels(labels,fontdict={'weight':'bold','size':15,'color':'k'})
ax.set_theta_zero_location('N') #設置零度方向北
ax.set_theta_direction(-1) # 逆時針方向繪圖
#----設置y坐標軸以百分升則數顯示
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda s, position: '{:.0f}%'.format(100*s)))
plt.legend(loc=4, bbox_to_anchor=(0.05, -0.25),fontsize=12) # 將label顯示出來, 並調整位置
#----保存圖片
plt.savefig("./windrose1.svg")