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