本專案展示如何以動態長條圖的方式,更直觀地呈現不同對象(如候選人、國家、投資報酬率)在時間維度上的變化趨勢。
初期以 Plotly Express 進行概念驗證(效果不佳,因此改用 raceplotly 製作最終成品),使長條圖能隨著時間自動更新,形成連續的「奔跑效果」。
專案說明:本專案聚焦於奔跑的長條圖,不包含進一步的統計分析。
本專案的長條圖分為兩個部分:
資料來源:
reported_on:日期country:國家名稱confirmed:累計確診數collected_at:時間candidate:候選人名稱sum_votes:單次票數cumulative_sum_votes:累計票數資料皆採用前期專案建立的 SQLite 資料庫。
詳細清理與建置過程可參考附錄與先前專案紀錄。
完整程式碼:create_bar_chart_race_data.py
清理過程參考 1:COVID_19.db
清理過程參考 2:taiwan_presidential_election_2024.db
選舉資料:使用 cumsum() 累加開票進度
全國投開票所完成時間,以模擬票數逐步增加的真實過程。cumsum() ,能計算每個時間點的「累積開票進度」,讓長條圖呈現連續的變化軌跡。
# 候選人(candidate) 為群組,依照索引(index)的順序累加票數。
votes_by_collected_at_candidate['cumulative_sum_votes'] = (
votes_by_collected_at_candidate.groupby(['candidate'])['sum_votes'].cumsum()
)
疫情資料:使用 nlargest() 篩選每日確診前十名
2020-12-31 前的資料,這段期間變化幅度較大,能更清楚觀察疫情發展趨勢。confirmed 已是累積數據,不需再累加。nlargest(10) 篩選保留每日確診人數最高的前 10 名國家,使視覺呈現更聚焦、易於比較。
# nlargest(10) 找出每日 confirmed 前10 的 index。
nlargest_index = covid_19_confirmed.groupby("reported_on")["confirmed"].nlargest(10).reset_index()["level_1"].values
# 依 nlargest_index 重新篩選並排序 covid_19_confirmed 資料。
covid_19_confirmed = covid_19_confirmed.loc[nlargest_index, :].reset_index(drop=True)
心得:很有趣的使用方法,以
nlargest找出目標資料的index。過去只使用**布林(boolean)**的方式來篩選資料,對我來說是一個很新的應用方法。