风玫瑰图一般包括风向玫瑰与风速玫瑰,它是快速了解某地气候条件的依据之一,对于城乡规划设计具有重要参考意义。
本文以北方某滨海城市A为例,论述利用python与可视化利器pyecharts绘制风向玫瑰的技术流程。与传统绘制工具Excel相比,pyecharts可提供更加多样化的可视化风格,并且在组件定制与批处理方面具有独特优势。
01
基本思路
1.1 数据来源。城市A风向信息来源为中国气象数据网(https://www.ngdc.noaa.gov/eog/download.html)地面资料逐月数据,包括区站号、有效时段、月序、累年月平均风速、年月最多风向(含静风)、累年月最多风向(不含静风)等。
1.2 绘制思路。绘制风向玫瑰图遵循1)逐月风向频数统计;2)季度风向频数统计;3)逐年风向频数统计;4)基于pyecharts的雷达图(Radar)可视化。
风向方位与代码的转换参照中国气象网提供的《风向方位代码表》;对于缺测、不观测和无数据的要素特征值,本文中均以0值代替。
02
技术流程
2.1 逐月风向频数矩阵建立。本文风向数据选择累年月最多风向(不含静风),首先构建逐月即(1-12月)-风向(16方位)频数的多维0数组;其次将多维数组转化为dtype类型,并设置其行列索引分别为16方位风向与1-12月,形成逐月风向矩阵。
feng_mat = np.zeros((len(oris), len(months))) # 建立多维0数组df_feng_mat = pd.DataFrame(feng_mat)df_feng_mat.columns, df_feng_mat.index = months, oris # 为数组添加行列索引# print(df_feng_mat)
遍历逐月风向矩阵,为矩阵赋值。其判断条件包括1)月份匹配;2)风向方位匹配;3)风向方位有效。
for i in months: # 遍历数组行 for j in range(len(oris)): # 遍历数组列 # print(i, oris[j], codes[j]) try: # 统计i月出现j风信息,排除异常值 fengij = df_qixiangs.loc[(df_qixiangs[infos[4]] == codes[j]) & (df_qixiangs[infos[1]] == i) & (df_qixiangs[infos[4]] < 99999)][infos[4]].to_list() # print(fengij, len(fengij)) df_feng_mat.iloc[j][i] = len(fengij) except: continue
2.3 季度/年度风向频数矩阵建立。本文中分别对春、夏、秋、冬四季的风向频数进行统计,其月份对应于3-5月、6-8月、9-11月、12-2月(南北半球的四季不尽相同,应根据实际情况进行划分);年度风向频数统计即为1-12月风向频数之和。
springms, summerms, autumnms, winterms = [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 1, 2]springs, summers, autumns, winters = labs[springms], labs[summerms], labs[autumnms], labs[winterms]seasons4 = [[] for n in range(5)]for i in range(len(oris)): seasons4[0].append(sum(list(springs.iloc[i]))) # 取第i行数据,转为列表,求和 seasons4[1].append(sum(list(summers.iloc[i]))) # 取第i行数据,转为列表,求和 seasons4[2].append(sum(list(autumns.iloc[i]))) # 取第i行数据,转为列表,求和 seasons4[3].append(sum(list(winters.iloc[i]))) # 取第i行数据,转为列表,求和 seasons4[4].append(sum(list(labs.iloc[i]))) # 取第i行数据,转为列表,求和(逐年)# 四季单独统计season1 = pd.DataFrame(seasons4[0])season2 = pd.DataFrame(seasons4[1])season3 = pd.DataFrame(seasons4[2])season4 = pd.DataFrame(seasons4[3])season1_4 = pd.DataFrame(seasons4[4])season1.index, season2.index, season3.index, season4.index, season1_4.index = oris, oris, oris, oris, oris
2.4 基于pyehcarts雷达图的可视化。雷达图属于pyecharts基本图表,一般设置包括雷达图模式设置(.add_schema())、系列设置(.add())等。雷达图模式设置内容包括雷达形状(shape)、径向轴(radiusaxis)、角度轴(angleaxis)等。
charts.add_schema(schema=season_js, shape='circle', center=['50%', '50%'], radius='80%', angleaxis_opts=opts.AngleAxisOpts( min_=0, # 坐标轴刻度最小值 max_=360, # 坐标轴刻度最大值 is_clockwise=True, interval=22.5, # 强制设置坐标轴分割间隔 axistick_opts=opts.AxisTickOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False,), # 坐标轴线标签配置项 axisline_opts=opts.AxisLineOpts(is_show=True), # 坐标轴线风格配置项 splitline_opts=opts.SplitLineOpts(is_show=True) # 分割线配置项 ), radiusaxis_opts=opts.RadiusAxisOpts( min_=n_min, # 坐标轴刻度最小值 max_=n_max, # 坐标轴刻度最大值 interval=2, # 强制设置坐标轴分割间隔 splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=0.2, ) ), splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(is_show=True, width=0.5, color='grey')), axislabel_opts=opts.LabelOpts(is_show=True, font_size=12, color='grey'), # 坐标轴线标签配置项 ), polar_opts=opts.PolarOpts(), splitarea_opt=opts.SplitAreaOpts(is_show=True), splitline_opt=opts.SplitLineOpts(is_show=False), # 分割线配置项 textstyle_opts=opts.TextStyleOpts(color='black', font_size=14) )
系列设置包括系列名称、系列数据、系列线样式、标记等设置(其它设置如全局设置对于雷达图可视化效果未有较大影响,故此不做论述)。设置完成后渲染即得到四季及全年风向玫瑰图。
charts.add(series_name='%s玫瑰图' % season_name, # 系列名称 data=data_fengsu, # 系列数据 areastyle_opts=opts.AreaStyleOpts(opacity=0.5, # 系列面样式设置 color=seasonareacolor), linestyle_opts=opts.LineStyleOpts(width=2, # 系列线样式设置 color=seasonlinecolor), label_opts=opts.LabelOpts(is_show=False), ) # 系列标签设置charts.render(filechart)
滑动查看更多
图1 四季及全年风向玫瑰图
03
结语
本文以城市A风向玫瑰图为例论述了基于python的绘制流程,风速玫瑰图在方法上与此类似。感兴趣者可以再作探讨。文中所采用的雷达图风格及其样式设置仅作为示例,感兴趣者可以深入探讨,以更好发挥pyecharts在可视化方面的优势。