前面幾隻影片分享了怎麼使用matplotlib來繪製柱狀圖,這期影片結合前面的知識點來繪製一個各國新冠肺炎確診數的小動畫
Step1:抓資料
這裡有提供新冠肺炎的相關確診、死亡等數據,選擇下載第一個確診數的csv檔案
我將其改名為data.csv,將檔案存到與專案同一個資料夾
Step2:整理資料
這邊我們可以使用pandas整理資料,其程式碼如下:
data = pd.read_csv('data.csv')
data = data.groupby('Country/Region').sum()
data = data.iloc[:,2:]
這邊三個步驟分別為:
1. 讀入資料
2.因為資料有細分到各州,所以用國家分為一群,然後把確診人數加起來
3.把不需要用到的前兩行資料去除
這邊牽涉到一些pandas語法,這篇文章以matplotlib為主,之後有機會在更仔細的分享pandas語法。
整理完的資料會長成這樣的格式
Step3:想法與畫每一天的圖
這邊的視覺化想法是用柱狀圖顯示每天確診最高的5個國家,所以我們的步驟是一行行的讀取每天各個國家的確診數,然後進行排序,最後在用柱狀圖畫出來,然後利用動畫功能進行動態的演示。
這邊我們先把動作分解成怎麼畫一天最高的5個國家的圖
#每一天如何作圖
date = pd.to_datetime(data.columns[0]).strftime('%Y-%m-%d')
countries = list(data.iloc[:,0].sort_values()[-5:].index)
values = list(data.iloc[:,0].sort_values()[-5:])
plt.barh(countries,values)
plt.title(date)
plt.xlabel('Confirmed Number')
plt.show()
所以這就是我們動畫的每一幀需要呈現的圖
Step4 動畫化
這邊我們要利用matplotlib的動畫功能進行動畫的製作,這邊我們採用的FuncAnimation這個函數,我們可以定義一個函數指定每一幀的圖示怎樣呈現
程式碼如下
def animate(i):
date = pd.to_datetime(data.columns[i]).strftime('%Y-%m-%d')
countries = list(data.iloc[:,i].sort_values()[-5:].index)
values = list(data.iloc[:,i].sort_values()[-5:])
plt.cla()
plt.barh(countries,values)
plt.title(date)
plt.figure(figsize=(20,15))
ani = FuncAnimation(plt.gcf(),animate,interval=1000,frames=len(data.columns))
plt.show()
在FuncAnimation有幾個值得注意的點,一個是plt.gcf是代表是我們對現在的畫布進行動畫的製作,interval屬性代表多久進到下一幀,數值代表千分之一秒,所以1000代表1秒,frames代表要帶入animate的資料
而讀者可能也在animate的程式碼看到plt.cla()指令,這代表matplotlib會清理前一幀的畫布遺留下的東西,詳細說明可看影片。
請問:我用colab照著做結果只出現Figure size 1440×1080 with 0 Axes,但是沒有圖。請問是為什麼呢?