python如何繪製動態的比特幣價格變化面積圖(文末贈書)

我們使用2013年-2019年比特幣(BTC)的價格數據繪製面積圖動畫,其HTML交互效果頁面如圖11-4-6所示。該數據集包括四列數據:年份(year)、城市名稱(name)及所在的洲(group)、人口密度數值(value),轉置的數據集如圖11-4-7所示,包括2013年04月28日起每天的開盤、最高、最低和收盤的價格。

點擊邊框調出影片工具條

圖11-4-6. 動態面積圖的HTML交互頁面效果圖

圖11-4-7. 2013年-2019年比特幣(BTC)的價格數據集

具體實現程式碼

我們先導入數據集'BTC_price_history.csv',然後將date列轉換成日期型數據。我們選擇一天的最高和最低價的均值作為這一天比特幣的價格Price。其具體程式碼如下:

我們設置圖表每次展示Span_Date=180天的比特幣價格數據,所以得到180天的數據集df_temp後,如果使用plt.fill_between()函數可以實現紅色填充的面積圖,如圖11-4-8(a)所示;如果使用plt.bar()函數可以實現Spectral_r顏色映射的面積圖,如圖11-4-8(b)所示。圖11-4-8的程式碼具體如下所示。

(a)單色填充.

(b)漸變色填充.

圖11-4-8. 靜態面積圖.

我們將上面的靜態面積圖程式碼整合成函數。當開始的日期天數據繪製面積圖;當開始的日期≥時,就選擇截止到當前日期的天數據繪製面積圖。使用函數繪製的不同日期的面積圖如圖所示。

(a)Num_Date=60.

(b)Num_Date=150.

圖11-4-9. 不同日期Num_Date的面積圖.

使用matplotlib包的animation.FuncAnimation()函數,調用draw_areachart(Num_Date)函數,其中輸入的參數Num_Date = np.arange(0,df.shape[0],1),最後使用Ipython包的HTML()函數將動畫轉換成HTML頁面的形式演示,其動畫不同日期下的演示效果如圖11-4-10所示。

其中,函數FuncAnimation(fig,func,frames,init_func,interval,blit)是繪製動圖的主要函數,其參數如下(1) fig 表示繪製動圖的畫布名稱(figure);(2)func為自定義繪圖函數,如draw_barchart()函數;(3)frames為動畫長度,一次循環包含的幀數,在函數運行時,其值會傳遞給函數draw_barchart (year)的形參「year」;(4) init_func為自定義開始幀,即初始化函數init,可省略;(5) interval表示更新頻率,計量單位為ms;(6) blit表示選擇更新所有點,還是僅更新產生變化的點,應選擇為True,但mac用戶應選擇False,否則無法顯示。

另外,也可以使用animator.save(『animation.gif』)或者animator.save(『animation.mp4)導出gif或者mp4格式的動畫。但是如果要導出mp4,需要先安裝已經安裝ffmpeg 或者mencoder。

圖11-4-10. 面積圖動畫不同時間下的演示效果

但是由於動畫默認的最大體積為20971520.0 bytes,所以圖11-4-10隻生成了2013年04月-2014年07月數據繪製的面積圖動畫。如果需要調整生成的動畫最大體積,需要更改參數animation.embed_limit:

ps:源程式碼與數據的Github下載地址:

https://github.com/EasyChart/Beautiful-Visualization-with-python

python數據可視化之美

本文來源即將出版的新書《python數據可視化之美》之動態圖表的繪製,除此之外,書中還介紹了動態條形圖和動態三維柱形地圖的繪製。

matplotlib包和plotnine包都可以實現動態數據的可視化演示。其中,在matplotlib包中,函數FuncAnimation(fig,func,frames,init_func,interval,blit)是繪製動圖的主要函數,其參數如下:(1) fig 為繪製動圖的畫布名稱; (2) func為自定義動畫函數update(),比如11-4-1的draw_barchart(year)和11-4-2的draw_areachart(Num_Date);(3) frames為動畫長度,一次循環包含的幀數,在函數運行時,其值會傳遞給函數update(n)的形參「n」;(4) init_func為自定義開始幀,即初始化函數,可省略;(5) interval為更新頻率,以ms計算;(5) blit為選擇更新所有點,還是僅更新產生變化的點。應選擇True,但mac用戶請選擇False,否則無法顯示。plotnine包的PlotnineAnimation()函數也可以繪製動態圖表,但是對於不斷更新的數據繪製動態圖表時,動態圖表生成速度很慢。