好奇心Log 发表于 2024-5-19 20:08:45

Python可视化 | 热带气旋统计分析-环状图

前言
Python中常用来表示百分比的绘图形式就是饼图,使用matplotlib中的plt.pie即可完成。
这种绘图过于单一,由其在默认配色下显得不够美观。


由此想到了对饼图进行改造,形成更加美观的环状图。其关键要点就是在原来饼图的基础上画一个半径更小的白底同心圆。
可以使用plt.Circle((0,0),0.70,fc='white')类似方法。

为了更贴近实际使用,本篇文章获取相关台风数据进行简单的统计分析,并使用环状图进行可视化展示。

数据介绍
中国气象局(CMA)的台风最佳路径数据集(BST),BST是之后对历史台风路径进行校正后发布的,其经纬度、强度、气压具有更高的可靠性,但是时间分辨率为6小时,部分3小时,这一点不如观测数据。
下载地址:http://tcdata.typhoon.org.cn
原始数据为txt格式,为了便于处理,此处已处理成csv,格式如下。


txt转换成csv的程序大家可以自己思考一下。这里提示一下,原来的txt格式中,每条新记录开头第一列都是66666,第三列是本次气旋过程共记录了多少行。感兴趣的小伙伴们可以根据这些自己尝试写一下。

没能搞定或者着急要数据的可以看文末的代码及数据获取方式。

导入模块
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
定义获取强度函数
def intensity(i):
    df1 = df==i]
    wsmax = max(df1['wind'])
    return list(set(df1.isin()]['level']))
创建数组
TS = np.array([])    # 存放热带风暴
STS = np.array([])   # 存放强热带风暴s
TY = np.array([])    # 存放台风
STY = np.array([])   # 存放强台风
SSTY = np.array([])# 存放超强台风
2000-2019年逐年热带气旋强度统计
for year in range(2000,2020):
    level = []
    df = pd.read_csv(f'./data/CH{year}BST.csv')
    numlist = list(set(df['number']))
    for num in numlist:
      level.append(intensity(num))
    TS = np.append(TS,level.count('热带风暴'))   
    STS = np.append(STS,level.count('强热带风暴'))
    TY = np.append(TY,level.count('台风'))
    STY = np.append(STY,level.count('强台风'))
    SSTY = np.append(SSTY,level.count('超强台风'))

fig, ax = plt.subplots(figsize=(12,15))

labels = ['TS','STS','TY','STY','SSTY']
explode = (0.05, 0.05, 0.05, 0.05, 0.05,)
colors = ['#66b3ff','#99ff99','#fff566','#ffc069','#ff7875']
for i in range(20):
    size = []
    size.append(TS<i>)
    size.append(STS<i>)
    size.append(TY<i>)
    size.append(STY<i>)
    size.append(SSTY<i>)
    plt.subplot(5,4,i+1)
    # draw pie
    wedges, texts, autotexts = plt.pie(
      size,
      explode=explode,
      autopct='%1.1f%%',
      colors=colors,
      shadow=True
    )
    # draw circle
    centre_circle = plt.Circle((0,0),0.70,fc='white')
    fig = plt.gcf()
    fig.gca().add_artist(centre_circle)
   
    plt.title(str(2000+i),fontsize=15)
    if i==11:
      plt.legend(wedges,
                   labels,
                   fontsize=12,
                   title="",
                   loc="center left",
                   bbox_to_anchor=(0.91, 0, 0.3, 1),
                  frameon=False)
plt.savefig('./typhoon_pie.png')</i></i></i></i></i>
代码及数据获取
1. 想一键跑通程序可点击阅读原文或在好奇心Log公众号后台回复气旋统计环状图
2. txt数据转csv数据代码获取方式在好奇心Log公众号后台回复气旋csv

文章来源于微信公众号:好奇心Log
页: [1]
查看完整版本: Python可视化 | 热带气旋统计分析-环状图