Python 使用Bokeh循环动画

Python 使用Bokeh循环动画,python,bokeh,Python,Bokeh,我不熟悉Bokeh和Python,这也是我的第一个堆栈溢出问题 我用Bokeh来绘制粒子在大脑中扩散的轨迹轮廓,但要将其设置为动画。我已经能够成功地创建一个程序来绘制点,但是一旦所有的点都被绘制,它就会停止。我希望能够循环动画,以便在绘制所有点后,它会清除自身并重新开始 我仍然对编码术语非常不熟悉,我无法找到可以做到这一点的东西。我认为在if语句中使用reset函数导入是正确的,但它似乎不起作用。我也参考了以下内容: 以下是我到目前为止绘制随机轨迹的代码: import numpy as np

我不熟悉Bokeh和Python,这也是我的第一个堆栈溢出问题

我用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()
将numpy导入为np
从bokeh.plotting导入图形、show、gridplot、vplot、hplot、curdoc
从bokeh.io导入输出\u笔记本
从bokeh.client导入推送会话
从bokeh.core.state导入状态为新
#这就是实际编码的开始。
b=np.rand.rand(300,3)
xlist=b[:,1]
ylist=b[:,2]
#创建打印并设置其特性的样式。在此处更改图表标题。
p=图(标题为'PEG'PLGA15k'F68'R2'P81',标题为'text'字体大小为'13pt',
x_范围=(最小(xlist),最大(xlist)),y_范围=(最小(ylist),最大(ylist)),)
#将文本渲染器添加到输出打印(还没有数据)
r=p.line(x=[],y=[],线宽=3,颜色为深蓝色)
会话=推送会话(curdoc())
i=0
ds=r.数据源
#创建将在随机位置添加数字的回调
def callback():
全球i
ds.data['x'].append(xlist[i])
ds.data['y'].append(ylist[i])
ds.trigger('data',ds.data,ds.data)
如果i
如果您只想在达到某个条件(如“已绘制所有点”)后重新启动动画,则只需重置数据源即可。例如,在你的例子中,你应该:

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

else:
    new.reset()
这就应该奏效了。只需使用您的数据源<代码>状态是一个更通用的组件,应该在不同级别上使用,而不是管理绘图图示符和数据源

这里有几个简短的提示:

  • 关于您的问题,您提到了一个指向
    0.10
    版本文档的链接,但从您的代码中,我可以看出您没有使用较新的版本(
    0.11.x
    )。始终确保为您正在使用的Bokeh版本使用正确的文档,因为在项目达到
    1.0
    之前,一个版本和另一个版本之间可能会有一些更改

  • 您不需要调用
    ds.trigger('data',ds.data,ds.data)
    ,因为bokeh属性系统将自动检测您对回调中数据源字段的更改

  • 您正在设计/运行一个bokeh脚本,该脚本使用到服务器的客户端会话(因此,您将在某处有一个bokeh服务器的运行实例,并且您的脚本将与之通信)。我建议您考虑将您的代码运行为BoKH应用程序,这样您的会话和代码就在BoKeh服务器实例中运行。您可以在网站上查看有关差异的更多详细信息


  • session.show()
    中缺少
    p
    ,因此正确的函数调用是
    session.show(p)
    ,否则不会显示绘图