python的pyecharts绘制南丁格尔玫瑰图
- 2020 年 4 月 11 日
- 笔记

作者:数据猿Riggle
来源:文科数据员
from:偶然得知医护界有一位叫“”南丁格尔的“提灯女神”,而且这位女神还创造了一种图,即“玫瑰图”。
for:pandas
的两个DataFrame
合并、pyecharts
的pie
的使用,描绘G20国家当前确诊状况。

随着新型冠状病毒的全球演进,越来越多的大佬都宣称此次疫情很有可能会形成一次类似于世界大战的历史变局。
全球各国有大有小,单看整体和个别国家并不能把疫情一目了然,那么可以怎么衡量全球变局的真实影响力呢?参考道琼斯指数,30支股票看美股全局,同样,二十国集团也可以看全球全局。

图:二十国集团杭州峰会
二十国集团占据了世界20国集团的经济总量约占世界的90%,贸易额占全球的80%,人口约40亿,占到全球的一半以上。可以说,只要知道G20国家现在疫情发展的怎么样,就知道世界现在怎么样了。
那么,如何可视化这个疫情情况呢?数据猿最近看到一个很漂亮的数据新闻的图,非常喜欢。深入学习以后才发现,原来这就是玫瑰图。

数据猿本事尚浅、时间有限,本篇文章主要分析G20各国的确诊人数,涉及pandas
的数据处理和pyecharts
的数据可视化。各位看官若有兴趣可以继续深挖。
第0号工作,梳理全部步骤——
- 导入数据,拿到全球疫情现状
- 清洗数据,拿到G20国家的确诊人数
- 数据可视化,绘制南丁格尔玫瑰图
导入数据
主要包括导入全球确诊数据和G20国家的数据列表。
#%% # 导入必要的第三方库 import pandas as pd from pyecharts.charts import Pie from pyecharts import options as opts #%% #导入疫情波及国家和地区的列表 data = pd.read_csv("data.csv",encoding='gbk') data.head() #%% #将疫情所在国家转为数组 COVID_country = data['国家'] COVID_country.head()
|
国家 |
新增确诊 |
累计确诊 |
治愈 |
死亡 |
---|---|---|---|---|---|
0 |
中国 |
39 |
81117.0 |
68801 |
3231 |
1 |
欧洲 |
7583 |
65743.0 |
3504 |
2762 |
2 |
意大利 |
3233 |
27980.0 |
2749 |
2158 |
3 |
西班牙 |
751 |
9942.0 |
571 |
309 |
4 |
德国 |
1174 |
7272.0 |
49 |
13 |
#%% # 导入G20国家的列表 G20 = ['中国','阿根廷','澳大利亚','巴西','加拿大','法国','德国','印度','印度尼西亚','意大利','日本' ,'韩国','墨西哥','俄罗斯','沙特阿拉伯','南非','土耳其','英国','美国','欧洲联盟'] # 列表转化为DataFrame格式 G20_df = pd.DataFrame({'index':range(1,21),'国家':G20}) G20_df.head()
|
index |
国家 |
---|---|---|
0 |
1 |
中国 |
1 |
2 |
阿根廷 |
2 |
3 |
澳大利亚 |
3 |
4 |
巴西 |
4 |
5 |
加拿大 |
清洗数据
这里清洗数据,就需要将G20国家名与全球国家的DataFrame
进行对比,从而筛选出G20国家的疫情。
这篇采用以下两种方法来进行DataFrame
与DataFrame
的对比筛选。
方法一:可以使用for
循环和append()
来筛选
#%% # 方法一:利用for循环枚举所有国家 country_lst = [] for index,i in enumerate(COVID_country): print(i) country_sick = dict() if i in G20_df['国家'].values: print(i) country_sick['country'] = i country_sick['Confirmed_case'] = data.loc[index,'累计确诊']#知道列的指数,就可以确定那一行的某个列 country_lst.append(country_sick) print(country_lst) #%% country_df = pd.DataFrame(country_lst) country_df.sort_values(by='Confirmed_case',ascending=False)
|
国家 |
累计确诊 |
---|---|---|
0 |
中国 |
81117.0 |
1 |
欧洲 |
65743.0 |
2 |
意大利 |
27980.0 |
3 |
西班牙 |
9942.0 |
4 |
德国 |
7272.0 |
方法二:使用pandas
的merge()
函数
#%% # 第二种方法,直接用merge函数 df = pd.merge(data,G20_df,on='国家') df = df.dropna(axis='columns',thresh=2).sort_values(by="累计确诊",ascending=False)
注:欧洲联盟和欧洲主要的G20国家有重叠,暂时去掉欧盟的数据,即共计19国。
数据可视化
数据都已经清洗完成,接下来就是可视化部分。
玫瑰图的绚丽多彩,其花瓣颜色和大小自然必不可少,需要设置漂亮的颜色,并根据数据选择适合的饼图半径和面积。
#%% # 导入玫瑰图所需颜色 color_series = ['#FAE927','#E9E416','#C9DA36','#9ECB3C','#6DBC49', '#37B44E','#3DBA78','#14ADCF','#209AC9','#1E91CA', '#2C6BA0','#2B55A1','#2D3D8E','#44388E','#6A368B' '#7D3990','#A63F98','#C31C88','#D52178','#D5225B',] #%% # 实例化Pie类 pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px')) # 设置颜色 pie1.set_colors(color_series)
#%% # 提取数据 v = df['国家'].values.tolist() d = df['累计确诊'].values.tolist() # 添加数据,设置饼图的半径,是否展示成南丁格尔图 import numpy as np pie1.add("", [list(z) for z in zip(v, np.round(np.sqrt(d),0))], radius=["20%", "100%"], center=["30%", "65%"], rosetype="area" ) #将人数d取平方根,并且再四舍五入,注意都要有np导入
注:因为各国疫情确诊人数数据相差悬殊,所以不能
配置图中各项,最后生成html
文件。
# 设置全局配置项 pie1.set_global_opts(title_opts=opts.TitleOpts(title='玫瑰图示例'), legend_opts=opts.LegendOpts(is_show=False), toolbox_opts=opts.ToolboxOpts()) # 设置系列配置项 pie1.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=12,formatter="{b}:{c}", font_style="italic",font_weight="bold", font_family="Microsoft YaHei"),) # 生成html文档 pie1.render('G20疫情确诊严重性玫瑰图.html')
打开html
文件

注:数据采自2020年3月21日凌晨,图中数值为疫情确诊人数的算术平方根
可以看出,G20国家目前还并没有全面被疫情笼罩,阿根廷、墨西哥、南非、俄罗斯、沙特、土耳其、印尼、巴西的疫情目前还处于相对较轻的状态。再考虑到中国的疫情已基本控制住,所以单从以上数据上,我们仍然可以保持一丢丢的乐观,人类世界目前只被疫情搞乱了一多半。
小结
之前都没有小结的习惯,不太好哈~
这篇文章有一些问题,南丁格尔玫瑰图不适合数据量相差非常大的数据。通过取算术平方根的形式虽然勉强弱化了这个问题,但又会使数据的意义产生偏差,或许不适合原定的问题。
◆ ◆ ◆ ◆ ◆

长按二维码关注我们
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:

猜你喜欢