【疫情動態條形圖】用Python開發全球疫情排名動態條形圖bar_chart_race

2022-10-04 21:01:38

一、開發背景

你好,我是 @馬哥python說 ,這是我用Python開發的全球疫情動態條形圖,演示效果:
https://www.zhihu.com/zvideo/1560327622025969664

二、講解程式碼

2.1 獲取資料

疫情資料從github手工下載的,地址是:
https://github.com/BlankerL/DXY-COVID-19-Data/releases/

github截圖:

資料下載後,檢視資料格式,欄位包含:

大洲中文、大洲英文、國家中文、國家英文、省份中文、省份英文、省份郵編、省份確診、省份疑似、省份治癒、省份死亡、城市中文、城市英文、城市郵編、城市確診、城市疑似、城市治癒、城市死亡、更新時間。

部分資料截圖:

注:由於網路原因,很多小夥伴打不開github,我已經下載好csv資料,公眾號「老男孩的平凡之路」後臺回覆「疫情資料」即可獲取最新csv資料!

2.2 資料淨化

csv下載好之後,開始清洗資料。

讀取csv檔案(唯讀取 國家名稱、確診數量、更新時間 這3個欄位):

# 讀取資料
data_file = 'DXYArea_20221003.csv'
df = pd.read_csv(data_file, usecols=['countryName', 'province_confirmedCount', 'updateTime'])

由於本次只分析2022年資料,所以過濾出2022的資料:

# 過濾出2022年的資料
df = df.loc[df.updateTime.astype(str).str.startswith('2022')]

由於中國資料和其他國家資料不同,中國資料是分省份統計的,所以先彙總,保證和其他國家資料格式一致:

# 由於中國資料是分省統計的,所以先把中國資料彙總一下
# 分組求和
df = df.groupby(['countryName', 'updateTime']).sum()
# 重置索引
df.reset_index(inplace=True)

轉換日期格式,並將時間去掉只保留日期:

# 轉換成日期型別
df['updateTime'] = pd.to_datetime(df['updateTime'])
# 把時間去掉,只保留日期
df['updateTime'] = df['updateTime'].apply(lambda x: x.strftime('%Y-%m-%d'))

由於存在每天多次統計的情況,所以只保留最新的一條資料:

df2 = df.groupby(['countryName', 'updateTime']).apply(lambda t: t[t.province_confirmedCount == t.province_confirmedCount.max()])
df2.drop_duplicates(inplace=True)  # 刪除重複值
df2.reset_index(inplace=True,drop=True) #重置索引

下面,開始行列轉換(很關鍵!這是bar_chart_race庫要求的輸入格式)

轉換程式碼:

# 行列轉換
df3 = df2.set_index(['updateTime', 'countryName'])['province_confirmedCount'].unstack()
df3.columns.name = None
# 重置索引
df3.reset_index(inplace=True)

轉換前,國家為行:

轉換後,國家為列:

下面就可以開始開發視覺化程式碼了。

2.3 視覺化開發

畫圖之前,再進行一次資料淨化:

# 資料淨化
df3.fillna(0, inplace=True)  # 填充空值
df3.set_index('updateTime', inplace=True)  # 設定索引

核心程式碼,視覺化開發條形圖:

import bar_chart_race as bcr
# 生成結果檔案
bcr.bar_chart_race(df=df3,  # 輸入資料
                   filename='covid19_10.mp4',  # 輸出檔名
                   n_bars=30,  # 柱子的個數
                   title='2022全世界TOP30疫情確診數量國家動態排名'  # 標題
                   )

程式碼中,我設定了4個引數(輸入資料、輸出檔名、條形圖條數、標題),當然,bar_chart_race還支援更多引數,比如圖片大小、標題大小、柱形大小、排序規則等等,詳細請見官網介紹:Bar Chart Race

最後效果(資料截止到2022.10.02):
https://www.zhihu.com/zvideo/1560327622025969664


本文首發公號: 【動態條形圖bar_chart_race】用Python開發全球疫情排名動態條形圖



我是馬哥,全網累計粉絲上萬,歡迎一起交流python技術。
各平臺搜尋「馬哥python說」:知乎、嗶哩嗶哩、小紅書、新浪微博。