視覺化專案 - 200 個國家 200 百年 4 分鐘
這是一個資料視覺化專案——「Dynamic Visualization: 200 Countries, 200 Years, 4 Minutes」。它將涵蓋 1816 至 2016 年,200 個國家的歷史變遷以互動動畫呈現,整體動畫長度約四分鐘,旨在結合「時間」與「地理」維度,提供用戶沉浸式的歷史視覺體驗。
成品呈現頁面: https://twcch.io/TwoHundredYearsTwoHundredCountries/views.html
GitHub 原始碼: https://github.com/twcch/TwoHundredYearsTwoHundredCountries
專案目標: 動態傳遞跨時代趨勢
我這次的核心目的,是打造一段「高品質又美觀」的互動式動畫。相比靜態圖表,此動畫能讓使用者更直覺地感受到全球歷史變化的脈絡與節奏。
- 跨國維度: 一次呈現 200 國家在相同指標上的變化
- 跨年代視角: 覆蓋整整兩個世紀
- 互動與美感: 最終以 Plotly Express 強化動畫的動態感與互動性
這是一個典型的「Proof of Concept」,驗證我能用純 Python 開源工具在本地完成動態資料視覺化,而不是依賴商業軟體。
處理流程解析
- 資料擷取與清理
- 使用 pandas 從 Gapminder 或其他開源來源讀入年份、國家與指標。
- 透過 core/data.py 標準化欄位名稱、處理缺值、並轉換為長型結構,以利後續分析。
- 寫入 SQLite
- 為了方便查詢與存取,我用 core/sqlite_db.py 將清理後的資料匯入 SQLite 資料庫,一併記錄 metadata。
- 產生視覺化資料表
- scripts/build_view_table.py 將資料按年與國家展開,組合成完整用於視覺化的 DataFrame。
- 動態驗證:matplotlib 原型
- 在 proof_of_concept.py 中,以 matplotlib 建立由靜態圖逐幀拼湊的基本動畫,確認播放邏輯與視覺節奏。
- 互動動畫:Plotly Express
- 最終在 plot_with_px.py 中改以 Plotly Express,產出包含滑動條、國家標籤、時間軸與音效的四分鐘互動畫面,並輸出至 docs/views.html。
技術選擇與實務考量
- 資料處理: pandas 濾除缺值、重塑表格、處理 metadata,全套操作都在 pandas 中完成。
- 儲存管理: 使用 SQLite 儲存資料,方便查詢與重複執行,而不用每次都從頭開 CSV。
- 動畫原型: matplotlib 可迅速驗證概念、調整幀率與時間間隔。
- 互動視覺化: Plotly Express 能更快速加入滑桿、hover 標籤,動畫更加流暢美觀,也更適合網頁展示。
展示成果
最終輸出是一個 HTML 檔,內嵌動態 html5 視覺化:
- 滑動時間軸:可從 1816 拉到 2016
- 多國同步動態顯示:多線圖或泡泡圖隨時間變化
- 互動細節:滑鼠懸停可顯示國家名稱、指標數值等資訊
效果直觀、沉浸感強,彷彿看一部微縮版的全球變遷紀錄片。
收穫與未來展望
- 已完成:
- 動態可互動圖表完成
- 資料處理 pipeline 與資料庫架構完成
- 概念驗證流程成熟
- 下一步:
- 加入更多指標:如教育、健康、人均收入等
- 支援自選國家比較:讓使用者自訂要比較的國家組合
- 優化動畫美感與效能:加入標註、顏色分群、手機友好版
- 部署 Web 平台:例如將 Plotly 圖表嵌入 Dash/Flask 前端,打造動態歷史觀測器
結語: 一場資料與歷史的對話
這個專案不只是「1 個動畫」,它是一個 歷史與科技交集的創作——我用 Python 工程流程,搭配資料視覺設計,重現 200 年來人類發展的縮影。看著點隨時間移動,國家指標變化,彷彿穿梭時空,讓人再次感嘆資料的力量。
歡迎有興趣的朋友參考原始碼,也希望與你交流更好的專案設計方式。