风玫瑰图一般包括风向玫瑰与风速玫瑰,它是快速了解某地气候条件的依据之一,对于城乡规划设计具有重要参考意义。

本文以北方某滨海城市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)



python风向玫瑰图的绘制 风向玫瑰图怎么绘制_python风向玫瑰图的绘制

python风向玫瑰图的绘制 风向玫瑰图怎么绘制_数据_02

python风向玫瑰图的绘制 风向玫瑰图怎么绘制_python风向玫瑰图的绘制_03

python风向玫瑰图的绘制 风向玫瑰图怎么绘制_数据_04

python风向玫瑰图的绘制 风向玫瑰图怎么绘制_python风向玫瑰图的绘制_05

滑动查看更多

图1 四季及全年风向玫瑰图

03

结语

本文以城市A风向玫瑰图为例论述了基于python的绘制流程,风速玫瑰图在方法上与此类似。感兴趣者可以再作探讨。文中所采用的雷达图风格及其样式设置仅作为示例,感兴趣者可以深入探讨,以更好发挥pyecharts在可视化方面的优势。