Matplotlib 和 Seaborn 用來做數據固定的靜態圖表很不錯,但如果需要動態顯示數據的變化過程用這倆庫就有點難度了。如果能用短視頻來動態展示圖表中數據的變化是不是就有點厲害了?而且不用學新的庫,就用Matplotlib 和 Seaborn,是不是更厲害了!今天就教大家一個很酷的教程,馬上動起來。
這里我們用到的數據是由美國疾控中心和藥物濫用研究所收集的。我最近用他們的數據給一個關于美國鴉片藥物濫用危機的紀錄片做了幾個動態圖所以這里就接著用了。下面是數據的下載鏈接:
下載地址:
https://www.drugabuse.gov/sites/default/files/overdose_data_1999-2015.xls
除了用Matplotlib和Seaborn來作圖我們還用到了Numpy和Pandas來處理數據。先把需要的庫都import進來:
接下來把數據從下載的Excel文件讀進來,我們用Pandas來讀所以讀進來就是一個DataFrame。這里我們還寫了一個傳入行數只讀取一行數據的函數。這是為了以后給不同藥物分別做圖的時候讀數據方便一些。
這些準備工作做好我們就可以開始作圖了。如果你用Jupyter Notebook的 話記得加圖表頁內顯示的命令%matplotlib notebook。
我們先用剛才寫的get_data函數把因為***死亡的人數讀出來。這個DataFrame有兩列,分別是年份和死亡人數。
接下來我們初始化一個ffmpeg輸出流。這里我設置幀率20碼率1800 ,當然你自己可以改幀率和碼率。
下面我們需要創建圖表和橫縱坐標。這里要把數據范圍定死不然數據更新的時候 Matplotlib 會自動更新數據范圍我們的動圖數據范圍就會來回變。
繪圖中最重要的就是下面這個 animate 函數,它的參數 i 指的是幀數。我們通過參數 i 來選擇這一幀應該顯示的數據然后用 Seaborn 來畫一個折線圖。最后兩行改改字體和折線的寬度讓圖好看一點。
要讓圖表動起來我們得把剛才定義的 animate 函數傳給 matplotlib.animation.FuncAnimation。除了animate,FuncAnimation還有一個參數frames,這個參數的意思是說我們這段動畫想一共要多少幀。這里 frames 的值是 17 幀,所以 animate 函數會被調用17次。
最后我們把這段動畫存成 mp4 格式就行了。如果想先看看效果,可以用plt.show()。
最后出來的效果是這樣的:
意思是有了但給人感覺數據的跳躍有點太快了,所以我們可能得給數據點中間插點值。插值可以用下面的 augment 函數:
用 augment 函數處理完數據我們還要調整一下 FuncAnimation 函數中的幀數。這里我給 augment 傳入的 numsteps 是 10,也就是說 augment 后從99 年到 15 年的 16 個數據點變成了 160 個,所以幀數也要設成 160。調整完的圖看著順溜多了,不過在數據增減變化的地方還是能看到很硬的拐彎。
為了讓這些拐角也平滑一點我們參考了下面這個鏈接里的高斯平滑算法。這個鏈接里也介紹了其他的平滑算法。
https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/
此外我們還可以給圖片加點背景色。
大功告成!其實不是大功,只是用 Matplotlib 制作動態圖表的一個很基本的例子。不過原理都是一樣的,在 animate 函數里繪圖然后調整調整合適的參數什么圖都能動起來。最后希望大家順利操作起來!
-
數據
+關注
關注
8文章
7133瀏覽量
89376 -
短視頻
+關注
關注
1文章
126瀏覽量
8971
原文標題:使用Python生成動態圖表,一個很Cool的教程
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論