python mat 转为list_利用Python助力风玫瑰绽放

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

本文以北方某滨海城市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)
9a7404f003c33c510084e40e31677d83.png 42f44e8a193a057f302d9bcd16e0a27e.png 6534e8871b47d0af3694ae72c7ecaa23.png cf46ba235cf3228c677f8bc13afb6a95.png 3c405c9d41474b5c8874395e69144955.png

滑动查看更多

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

03

结语

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

注:由于作者水平有限,论述中难免有疏漏。阅读中如有任何疑问或建议均可在后台留言,在此表示感谢!

点击蓝字关注我们

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值