數據可視化動畫還在用 Excel 做?
現在一個簡單的 Python 包就能分分鐘搞定!
而且生成的動畫也足夠絲滑,效果是醬紫的:
這是一位專攻 Python 語言的程序員開發的安裝包,名叫Pynimate。
目前可以直接通過 PyPI 安裝使用。
使用指南
想要使用 Pynimate,直接 import 一下就行。
import pynimate as nim
輸入數據後,Pynimate 将使用函數 Barplot()來創建條形數據動畫。
而創建這種動畫,輸入的數據必須是 pandas 數據結構(如下),其中将時間列設置為索引,換句話說索引代表的是自變量。
time, col1, col2, col3
2012 1 2 1
2013 1 1 2
2014 2 1.5 3
2015 2.5 2 3.5
具體的代碼形式如下:
import pandas as pd
df = pd.read_csv ( 'data'csv' ) .set_index ( 'time' )
比如要處理具體的數據,寫成代碼應該是這樣子的。
df = pd.DataFrame (
{
"time": [ "1960-01-01", "1961-01-01", "1962-01-01" ] ,
"Afghanistan": [ 1, 2, 3 ] ,
"Angola": [ 2, 3, 4 ] ,
"Albania": [ 1, 2, 5 ] ,
"USA": [ 5, 3, 4 ] ,
"Argentina": [ 1, 4, 5 ] ,
}
) .set_index ( "time" )
此外,要制作條形數據動畫,Barplot 還有三個必需的參數得注意:data、time_format 和 ip_freq(Interpolation frequency)。
data 就是表格的數據,這裡也就不再贅述。
time_format 是指數據索引的時間日期格式,一般為:"%Y-%m-%d"。
最後是 ip_freq,它是制作動畫中比較關鍵的一步,通過線性插值使動畫更加流暢絲滑。
一般來說,并不是所有的原始數據都适合做成動畫,現在一個典型的視頻是 24fps,即每秒有 24 幀。
舉個栗子,下面這個表格中的數據隻有三個時間點,按理說隻能生成 3 幀視頻,最終動畫也隻有 3/24 秒。
time, col1, col2
2012 1 3
2013 2 2
2014 3 1
這時候,ip_freq 插值(線性)就開始發揮作用了,如果插值是一個季度,則得出的數據就變成了這樣:
time col1 col2
2012-01-01 1.00 3.00
2012-04-01 1.25 2.75
2012-07-01 1.50 2.50
2012-10-01 1.75 2.25
2013-01-01 2.00 2.00
2013-04-01 2.25 1.75
2013-07-01 2.50 1.50
2013-10-01 2.75 1.25
2014-01-01 3.00 1.00
具體的插值時間間隔為多久,則要視具體的數據而定,一般繪制大數據時,設置為 ip_freq = None。
至此,就能生成數據動畫了,完整代碼如下所示:
from matplotlib import pyplot as plt
import pandas as pd
import pynimate as nim
df = pd.DataFrame (
{
"time": [ "1960-01-01", "1961-01-01", "1962-01-01" ] ,
"Afghanistan": [ 1, 2, 3 ] ,
"Angola": [ 2, 3, 4 ] ,
"Albania": [ 1, 2, 5 ] ,
"USA": [ 5, 3, 4 ] ,
"Argentina": [ 1, 4, 5 ] ,
}
) .set_index ( "time" )
cnv = nim.Canvas ( )
bar = nim.Barplot ( df, "%Y-%m-%d", "2d" )
bar.set_time ( callback=lambda i, datafier: datafier.data.index [ i ] .year )
cnv.add_plot ( bar )
cnv.animate ( )
plt.show ( )
這是插值為兩天,生成的動畫效果。
最後還有一個問題,那就是保存動畫,有兩個格式可以選擇:gif 或者 mp4。
保存為動圖一般使用:
cnv.save ( "file", 24, "gif" )
若要保存為 mp4 的話,ffmpeg 是個不錯的選擇,它是保存為 mp4 的标準編寫器。
pip install ffmpeg-python
或者:
conda install ffmpeg
當然,同樣也可以使用 Canvas.save ( ) 來保存。
cnv.save ( "file", 24 ,"mp4" )
作者介紹
julkar9,Python/Flutter 開發人員,研究的方向為數據分析與可視化。
小哥表示,Pynimate 還會不斷更新,目前正在接受大家的反饋,之後還會上線等值區域圖等功能。
他還開發了一個應用程序:Chatmetry,同樣也與數據統計有關,是一個用于創建 whatsapp 聊天統計數據的機器人應用程序。
這個程序可以從導出的聊天中生成各種統計信息,同時支持個人和群組聊天,并且是完全離線的,既不會保存也不會共享。
傳送門:
https://julkaar9.github.io/pynimate/