前言
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[df['number']==i]
wsmax = max(df1['wind'])
return list(set(df1[df1['wind'].isin([wsmax])]['level']))[0]
TS = np.array([]) # 存放热带风暴
STS = np.array([]) # 存放强热带风暴s
TY = np.array([]) # 存放台风
STY = np.array([]) # 存放强台风
SSTY = np.array([]) # 存放超强台风
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')