使用 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
是一个更通用的组件,应该在不同级别使用,而不是管理绘图字形和数据源。
这里有几个简短的注释:
关于你的问题,你在 0.10
版本文档中提到了 link,但从你的代码中我可以看出你没有使用较新的版本(0.11.x
).始终确保为您正在使用的 Bokeh 版本使用正确的文档,因为在项目达到 1.0
.
之前,一个版本和另一个版本之间可能会有一些变化
您无需调用 ds.trigger('data', ds.data, ds.data)
,因为 bokeh 属性 系统会自动检测您对回调中数据源字段的更改
你是 designing/running 你的脚本作为使用客户端会话到服务器的散景脚本(所以你将在某处有一个 运行ning 散景服务器实例并且您的脚本与之通信)。我建议您考虑 运行 将您的代码改为 Bokeh 应用程序,这样您的会话和代码 运行 就在 bokeh 服务器实例中。您可以在 bokeh server section on the official docs.
查看有关差异的更多详细信息
我是 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
是一个更通用的组件,应该在不同级别使用,而不是管理绘图字形和数据源。
这里有几个简短的注释:
关于你的问题,你在
0.10
版本文档中提到了 link,但从你的代码中我可以看出你没有使用较新的版本(0.11.x
).始终确保为您正在使用的 Bokeh 版本使用正确的文档,因为在项目达到1.0
. 之前,一个版本和另一个版本之间可能会有一些变化
您无需调用
ds.trigger('data', ds.data, ds.data)
,因为 bokeh 属性 系统会自动检测您对回调中数据源字段的更改你是 designing/running 你的脚本作为使用客户端会话到服务器的散景脚本(所以你将在某处有一个 运行ning 散景服务器实例并且您的脚本与之通信)。我建议您考虑 运行 将您的代码改为 Bokeh 应用程序,这样您的会话和代码 运行 就在 bokeh 服务器实例中。您可以在 bokeh server section on the official docs.
查看有关差异的更多详细信息