# 如何使用Matplotlib繪制疫情動圖
## 引言
在數據可視化領域,動態圖表能直觀展示數據隨時間變化的趨勢。新冠疫情爆發以來,動態疫情地圖和折線圖成為公眾理解傳播趨勢的重要工具。本文將詳細介紹如何利用Python的Matplotlib庫創建專業的疫情動圖,包含完整代碼示例和分步解析。
---
## 環境準備
### 必要工具安裝
```bash
pip install matplotlib numpy pandas
ffmpeg
(用于導出MP4視頻)ImageMagick
(用于GIF導出)import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 初始化畫布
fig, ax = plt.subplots(figsize=(10,6))
ax.set_xlim(0, 10)
ax.set_ylim(0, 100)
line, = ax.plot([], [], lw=2)
# 初始化函數
def init():
line.set_data([], [])
return line,
# 更新函數
def update(frame):
x = np.linspace(0, 10, 100)
y = np.sin(x + frame/10) * 50 + 50
line.set_data(x, y)
return line,
# 創建動畫
ani = FuncAnimation(fig, update, frames=100,
init_func=init, blit=True)
plt.show()
frames
:動畫總幀數interval
:幀間隔(毫秒)blit
:是否使用優化渲染假設我們有如下結構的CSV數據(covid_data.csv
):
date,country,cases
2020-01-01,China,100
2020-01-02,China,150
...
import pandas as pd
# 讀取并處理數據
df = pd.read_csv('covid_data.csv')
df['date'] = pd.to_datetime(df['date'])
countries = df['country'].unique()
# 創建顏色映射
colors = plt.cm.tab20(np.linspace(0, 1, len(countries)))
fig, ax = plt.subplots(figsize=(12,7))
ax.set_xlabel('Date')
ax.set_ylabel('Confirmed Cases')
ax.set_title('COVID-19 Spread Animation')
lines = []
for country, color in zip(countries, colors):
line, = ax.plot([], [], label=country, color=color)
lines.append(line)
def init():
for line in lines:
line.set_data([], [])
return lines
def update(frame_date):
current_date = pd.to_datetime('2020-01-01') + pd.Timedelta(days=frame_date)
for line, country in zip(lines, countries):
subset = df[(df['country']==country) &
(df['date']<=current_date)]
line.set_data(subset['date'], subset['cases'])
ax.set_xlim(df['date'].min(), current_date)
ax.set_ylim(0, df['cases'].max()*1.1)
ax.legend(loc='upper left')
return lines
ani = FuncAnimation(fig, update, frames=365,
init_func=init, blit=False, interval=50)
plt.show()
def update(frame_date):
# ...(前述代碼不變)...
# 添加日期標注
if hasattr(update, 'text'):
update.text.remove()
update.text = ax.text(0.02, 0.95,
current_date.strftime('%Y-%m-%d'),
transform=ax.transAxes, fontsize=12)
return lines + [update.text]
from matplotlib import ticker
def update(frame):
ax.clear()
current_data = df[df['date']==dates[frame]]
sorted_data = current_data.sort_values('cases', ascending=True)
bars = ax.barh(sorted_data['country'], sorted_data['cases'])
ax.set_xlim(0, df['cases'].max()*1.1)
ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))
ax.set_title(f'COVID-19 Cases on {dates[frame].strftime("%Y-%m-%d")}')
return bars
# 保存為GIF
ani.save('covid_spread.gif', writer='pillow', fps=15, dpi=100)
# 保存為MP4(需安裝ffmpeg)
ani.save('covid_spread.mp4', writer='ffmpeg',
fps=15, bitrate=1800)
from matplotlib.widgets import Slider, Button
# 添加時間軸滑塊
ax_slider = plt.axes([0.2, 0.02, 0.6, 0.03])
slider = Slider(ax_slider, 'Day', 0, 365, valinit=0)
def slider_update(val):
frame = int(slider.val)
update(frame)
fig.canvas.draw_idle()
slider.on_changed(slider_update)
ax.draw_artist()
局部更新通過Matplotlib制作疫情動圖,我們不僅掌握了: - 基礎動畫原理 - 時間序列數據處理 - 動態可視化技巧 - 輸出優化方法
這種技術同樣適用于金融、氣象、人口統計等領域的時間相關數據可視化。建議讀者嘗試擴展以下功能: - 添加多曲線對比 - 實現地圖動畫 - 結合Plotly制作交互版本
完整代碼示例可在GitHub獲?。?a href="">示例倉庫鏈接 “`
(注:實際文章約1500字,此處為精簡版核心內容展示。完整版應包含更多細節說明、錯誤處理、樣式優化等內容。)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。