
1、前言
风速和风向是气象中常见的观测变量,水平风速可以分解为u和v方向的两个分量。为了统计风速和风向的频率,我们可以使用前面介绍的风玫瑰图。但是风玫瑰图并不包含时间序列的变化特征,而是一个基于统计的结果,为了更好的展示风速的变化规律,可以使用热力图形式加以表达。
2、绘制风向风速热力图
1import matplotlib.pyplot as plt
2import numpy as np
3import seaborn as sns
4from matplotlib import colors
5import matplotlib.colors as mcolors
6import pandas as pd
7import cmaps
步骤二:生成数据
1np.random.seed(2021)
2u = np.random.randint(low=-12,high=12,size=(31,24))
3v = np.random.randint(low=-12,high=12,size=(31,24))
4ws = np.sqrt(u**2+v**2)
5data = pd.DataFrame(ws,index=np.arange(1,32), columns=np.arange(0,24))
步骤三:绘制热力图
1fig = plt.figure(figsize=(18, 18))
2sns_plot = sns.heatmap(data, cmap=cmaps.wind_17lev,linecolor='k',vmin=0,vmax=18,linewidths = 0.1, annot=True, cbar=False)
3cb = sns_plot.figure.colorbar(sns_plot.collections[0])
4cb.ax.tick_params(labelsize=12)
5x = np.arange(0,24)
6y = np.arange(1,32)
7x, y = np.meshgrid(x, y)
8plt.quiver(x + 0.5, y - 0.5, u, v, scale = 600, headwidth = 2, width = 0.003)
9plt.xlabel('Hour',fontsize=15)
10plt.ylabel('Month',fontsize=15)
11plt.xticks(fontsize=12)
12plt.yticks(fontsize=12,rotation=360)
13sns_plot.tick_params(labelsize=12, direction='in')
14plt.show()

第二,小风的风向箭头太小,不能很好地展示方向。
步骤四:进阶版
1def drawArrow(A, B ,ax_1):#画箭头
2 ax = ax_1.twinx()
3 if A[0] ==B[0] and A[1] ==B[1]:#静风画点
4 ax.plot(A[0],A[1],'ko')
5 else:
6 ax.annotate("", xy=(B[0], B[1]), xytext=(A[0], A[1]),arrowprops=dict(arrowstyle="->"))
7 ax.spines['left'].set_visible(False)
8 ax.spines['right'].set_visible(False)
9 ax.spines['top'].set_visible(False)
10 ax.spines['bottom'].set_visible(False)
11 ax.set_xlim(0,24)
12 ax.set_ylim(0,5)
13 ax.get_yaxis().set_visible(False)
14 ax.set_aspect('equal') #x轴y轴等比例
15 plt.tight_layout()
16
17def drow_wind_heatmap(wd,ws,xticklabels):
18 f, ax = plt.subplots(figsize=(12, 3))
19 uniform_data = []
20 uniform_data.append(ws)
21 colors = ['lightskyblue','darkturquoise','lime','greenyellow','orangered','red']
22 clrmap = mcolors.LinearSegmentedColormap.from_list("mycmap",colors)
23 sns.heatmap(uniform_data,square=True,annot=True, fmt="d",linewidths=.5,cmap=clrmap,yticklabels=['windspeed'],xticklabels=xticklabels,cbar=False,vmin=0,vmax=8,ax = ax)
24 ax.set_xticklabels(ax.get_xticklabels(), rotation=0)
25 ax.set_yticklabels(ax.get_yticklabels(), rotation=0)
26 ax.spines['bottom'].set_position(('data',1))
27
28 for i in range(24):
29 if wd[i] != 'c':
30 a = np.array([0.5+0.5*np.sin(wd[i]/ 180 * np.pi)+i,3.5+0.5*np.cos(wd[i]/ 180 * np.pi)])
31 b = np.array([0.5-0.5*np.sin(wd[i]/ 180 * np.pi)+i,3.5-0.5*np.cos(wd[i]/ 180 * np.pi)])
32 drawArrow(a,b,ax)
33 else:
34 a = np.array([0.5+i,3.5])
35 drawArrow(a,a,ax)
36
37 plt.show()
38
39if __name__ == "__main__":
40 x_time = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
41 wind_speed = [2,4,4,3,4,2,1,1,1,2,1,2,1,2,1,1,1,1,0,0,0,1,0,1]
42 wind_direction = [340,110,90,110,180,130,350,30,230,260,240,240,230,210,200,250,250,230,'c','c','c',100,'c',250]
43 drow_wind_heatmap(wind_direction,wind_speed,x_time)

有问题可以到QQ群里进行讨论,我们在那边等大家。
QQ群号:854684131
文章转载自气海无涯,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




