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()函数也可以绘制动态图表,但是对于不断更新的数据绘制动态图表时,动态图表生成速度很慢。