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國家目前還並沒有全面被疫情籠罩,阿根廷、墨西哥、南非、俄羅斯、沙特、土耳其、印尼、巴西的疫情目前還處於相對較輕的狀態。再考慮到中國的疫情已基本控制住,所以單從以上數據上,我們仍然可以保持一丟丟的樂觀,人類世界目前只被疫情搞亂了一多半。
小結
之前都沒有小結的習慣,不太好哈~
這篇文章有一些問題,南丁格爾玫瑰圖不適合數據量相差非常大的數據。通過取算術平方根的形式雖然勉強弱化了這個問題,但又會使數據的意義產生偏差,或許不適合原定的問題。
◆ ◆ ◆ ◆ ◆

長按二維碼關注我們
數據森麟公眾號的交流群已經建立,許多小夥伴已經加入其中,感謝大家的支持。大家可以在群里交流關於數據分析&數據挖掘的相關內容,還沒有加入的小夥伴可以掃描下方管理員二維碼,進群前一定要關注公眾號奧,關注後讓管理員幫忙拉進群,期待大家的加入。
管理員二維碼:

猜你喜歡