使用 Bokeh 循环播放动画

Looping an animation using Bokeh

我是 Bokeh 和 Python 的新手,这也是我的第一个 Stack Overflow 问题。

我正在使用 Bokeh 来绘制在大脑中扩散的粒子的轨迹剖面图,但要对其进行动画处理。我已经能够成功地创建一个绘制点的程序,但是一旦绘制了所有点,它就会停止。我希望能够循环播放动画,以便在绘制完所有点后,它会自行清除并重新开始。

我对编码术语仍然很不熟悉,而且我找不到可以做到这一点的东西。我认为我在 if 语句中使用 reset 函数导入是正确的,但它似乎不起作用。我也查看了以下内容以供参考:

到目前为止,这是我绘制随机轨迹的代码:

import numpy as np
from bokeh.plotting import figure, show, gridplot, vplot, hplot, curdoc
from bokeh.io import output_notebook
from bokeh.client import push_session
from bokeh.core.state import State as new

# This is where the actual coding begins.
b = np.random.rand(300, 3)
xlist = b[:, 1]
ylist = b[:, 2]

# create a plot and style its properties.  Change chart title here.
p = figure(title='PEG_PLGA15k_F68_R2_P81', title_text_font_size='13pt',
       x_range=(min(xlist), max(xlist)), y_range=(min(ylist), max(ylist)),)

# add a text renderer to out plot (no data yet)
r = p.line(x=[], y=[], line_width=3, color='navy')

session = push_session(curdoc())

i = 0
ds = r.data_source


# create a callback that will add a number in a random location
def callback():
    global i
    ds.data['x'].append(xlist[i])
    ds.data['y'].append(ylist[i])
    ds.trigger('data', ds.data, ds.data)
    if i < xlist.shape[0] - 1:
        i = i + 1
    else:
        new.reset()

# Adds a new data point every 67 ms.  Change at user's discretion.
curdoc().add_periodic_callback(callback, 67)

session.show()

session.loop_until_closed()

如果您只想在达到某个条件(如 "all points have been plotted")后重新启动动画,您只需重置数据源即可。因此,例如,在您的示例中,您应该具有:

else:
    i = 0
    ds.data['x'] = []
    ds.data['y'] = []

而不是:

else:
    new.reset()

这应该可以解决问题。只需使用您的数据源... State 是一个更通用的组件,应该在不同级别使用,而不是管理绘图字形和数据源。

这里有几个简短的注释:

  1. 关于你的问题,你在 0.10 版本文档中提到了 link,但从你的代码中我可以看出你没有使用较新的版本(0.11.x).始终确保为您正在使用的 Bokeh 版本使用正确的文档,因为在项目达到 1.0.

  2. 之前,一个版本和另一个版本之间可能会有一些变化
  3. 您无需调用 ds.trigger('data', ds.data, ds.data),因为 bokeh 属性 系统会自动检测您对回调中数据源字段的更改

  4. 你是 designing/running 你的脚本作为使用客户端会话到服务器的散景脚本(所以你将在某处有一个 运行ning 散景服务器实例并且您的脚本与之通信)。我建议您考虑 运行 将您的代码改为 Bokeh 应用程序,这样您的会话和代码 运行 就在 bokeh 服务器实例中。您可以在 bokeh server section on the official docs.

  5. 查看有关差异的更多详细信息