點擊上方關注,All in AI中國
Matplotlib和Seaborn是Python中的一些很好的繪圖庫,可以創建漂亮的圖形。但這些圖都是靜態的,很難以動態和令人愉悅的方式描繪數據值的變化。如果在演示文稿、視頻或社交媒體帖子中可以使用短視頻剪輯來展示數據的發展,那該有多好?此外,你可以繼續使用Matplotli、Seaborn或任何喜歡用於描述動態情節的庫。
我最近為一部關於美國阿片類藥物危機的簡短紀錄片製作了一些動態情節,所以我將在這篇文章中使用這些數據。 這些數據由美國國家藥物濫用研究所和疾病預防控制中心公佈,可在此處下載:https://www.drugabuse.gov/sites/default/files/overdose_data_1999-2015.xls。
在這篇文章中,我使用了Matplotlib,並添加Seaborn進行繪圖,將Numpy與Pandas一起用於數據處理。對於動畫,Matplotlib提供了一些我們可以使用的功能。因此,我們繼續實施並導入所有依賴項。
現在,為了準備動畫數據,我們只需加載它並將其放入Pandas DataFrame中。在製作關於不同阿片類藥物過量的幾個圖表時,也可以方便地編寫一個函數,來加載感興趣的行中的數據。
現在讓我們開始製作動畫。
首先,如果你正在使用像我這樣的jupyte記事本,那麼最好使用matplotlib notebook記事本啟動這個單元,這樣你就可以立即在記事本中看到動畫,而不僅僅是在保存之後。
在這個例子中,我現在使用get_data函數從表中檢索海洛因過量數字,並將其打包到具有兩列的Pandas DataFrame中。一列為年份,另一列為過量用藥而死亡的人數。
接下來,我們初始化一個使用ffmpeg並以20 fps記錄比特率為1800的編寫器。你當然可以自己選擇這些值。
現在我們創建一個帶有一些標籤的圖形。確保設置x和y軸的限制,以便動畫不會隨當前顯示的數據範圍跳轉。
動畫的核心部分是動畫函數,你可以在其中定義視頻每幀中發生的事情。這裡我表示動畫中幀的索引。使用此索引,你可以選擇應在此框架中可見的數據範圍。在這之後我使用seaborn線性圖來繪製這個數據選擇。最後兩行只是為了使情節看起來更令人愉悅。
要啟動動畫,請使用matplotlib.animation.FuncAnimation,在其中鏈接動畫函數並定義動畫應包含的幀數。因此,幀定義了動畫(i)被調用的頻率。
要將此動畫保存為mp4,只需調用ani.save()即可。如果只想在保存之前查看它,請調用plt.show()
所以現在動畫看起來像這樣:
這種做法很有效,但它跳躍仍然非常頻繁。為了避免它的跳躍,我們需要在已經擁有的數據點之間提供更多的數據點。為此,我們可以使用另一個函數,在這裡稱之為augment。
現在我們只需要將此函數應用於我們的數據,並增加matplotlib.animation.FuncAnimation函數中的幀數。在這裡,採用numsteps = 10來調用augment,這意味著將訓練數據增加到160個數據點,並且必須設置frames=160。其結果看起來更加平滑,但仍有一些尖銳的邊緣,數據值會發生變化。
為了消除這些缺陷,我們可以實現如下所述的平滑函數:
https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/
此外,我們可以添加一些顏色和樣式參數,使其情節看起來更加個性化。
這就是我們如何獲得上面顯示的最終結果。
這篇文章只是在一個例子中顯示了matplotlib動畫函數。當然,你可以將它用於任何想要動畫的繪圖。簡單調整animate函數內的參數和繪圖類型,而其可能性是無窮的。
我希望你會喜歡matplotlib這個功能,並且可以把應用到更多、更好的用途。如果你想查看我製作的所有圖形的完整紀錄片,並獲得靈感,你可以在這裡找到它:https://youtu.be/7xrvuSDLHiY
閱讀更多 AI中國 的文章