将动画散景图导出为 GIF

Exporting animated Bokeh plots as GIF

我一直在研究使用 Bokeh 库为我正在进行的一些小项目创建动画数据可视化。我觉得 gif 格式将是导出这些可视化效果的最佳文件格式。它被广泛使用,应该很容易共享。

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

如果是这样,我是否需要使用任何其他工具来执行此操作?

如果不是,是否有更适合此的不同文件格式?

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

如有任何帮助,我们将不胜感激。非常感谢。

Bokeh 图有一个 SaveTool,它允许您以 PNG 格式手动保存图 canvas,但这对您来说需要做很多工作。或者,您可以通过使用 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