我一直在研究如何使用Bokeh库为我正在进行的一些小项目创建动画数据可视化。我觉得gif格式是导出这些可视化的最佳文件格式。它被广泛使用,它们应该很容易分享。
是否可以(并且建议)以gif格式导出散景动画图?
如果是这样,我是否需要使用任何其他工具来执行此操作?
如果没有,是否有更适合这种情况的不同文件格式?
我发现这个线程有关在Python中创建gif的潜在选项,但我不确定它们是否与Bokeh库相关。 Programmatically generate video or animated GIF in Python?
任何帮助将非常感激。非常感谢。
Bokeh图有一个SaveTool,它允许你以PNG格式手动保存绘图画布,但这将是你要做的很多工作。或者,您可以通过使用update()
函数实现Bokeh服务器应用程序来自动执行此过程,该函数可更新绘图的data_source
属性,例如:每秒使用export_png()
函数保存屏幕截图。然后你可以使用这些图像来构建动画,例如使用上面提到的Python库。
这是使用bokeh serve --show app.py
运行的示例脚本:
app.py
的内容:
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, curdoc
from datetime import datetime
from bokeh.io import export_png
import random
source = ColumnDataSource(dict(time = [datetime.now()], value = [random.randint(5, 10)]))
plot = figure(plot_width = 1200, x_axis_type = 'datetime', tools = 'pan,box_select,crosshair,reset,save,wheel_zoom')
plot.line(x = 'time', y = 'value', line_color = 'black', source = source)
counter = 0
def update():
global counter
new_source_data = dict(time = [datetime.now()], value = [random.randint(5, 10)])
source.stream(new_source_data)
counter = counter + 1
export_png(plot, filename = "plot_" + str(counter) + ".png")
curdoc().add_root(plot)
curdoc().add_periodic_callback(update, 1000)
要使此脚本正常工作,您需要在系统上安装phantomjs
。所以首先你需要安装nodejs
和npm
,然后像这样安装phantomjs
:
sudo npm install -g phantomjs-prebuilt
如果您正在使用Mac,那么另一种选择是使用QuickTime Player
屏幕录制制作电影,然后使用FFMPEG
将其转换为动画gif,如this post中所述