将动画散景图导出为GIF

时间:2019-03-14 15:01:45

标签: python data-visualization bokeh animated-gif

我一直在研究使用Bokeh库为我正在从事的一些小项目创建动画数据可视化。我认为gif格式将是导出这些可视化效果的最佳文件格式。它被广泛使用并且应该易于共享。

是否可以(并且建议)以gif格式导出散景动画情节?

如果是这样,我是否需要使用任何其他工具来做到这一点?

如果没有,是否有其他文件格式更适合于此?

我发现了这个线程,它涉及在Python中创建gif的潜在选项,但是我不确定它们是否与Bokeh库相关。 Programmatically generate video or animated GIF in Python?

任何帮助将不胜感激。非常感谢。

1 个答案:

答案 0 :(得分:1)

散景图具有一个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。因此,首先您需要安装nodejsnpm,然后像这样安装phantomjs

sudo npm install -g phantomjs-prebuilt

如果您使用的是Mac,则另一种选择是使用QuickTime Player屏幕录像来制作电影,然后使用FFMPEG将其转换为动画gif,如this post