Bokeh:在一个Python回调中多次更新figure
我想在一个Python回调中多次更新一个图。作为一个简单的例子,比如说在点击一个按钮后,我想改变一条线的坐标10次,每次都会在短时间内显示改变后的线。如果您愿意,可以将其称为动画 在Bokeh文档中,我只找到了 以下是一个不起作用的示例,说明了我想要的:Bokeh:在一个Python回调中多次更新figure,python,bokeh,Python,Bokeh,我想在一个Python回调中多次更新一个图。作为一个简单的例子,比如说在点击一个按钮后,我想改变一条线的坐标10次,每次都会在短时间内显示改变后的线。如果您愿意,可以将其称为动画 在Bokeh文档中,我只找到了 以下是一个不起作用的示例,说明了我想要的: from time import sleep from bokeh.plotting import curdoc, figure from bokeh.models import ColumnDataSource, Button from bo
from time import sleep
from bokeh.plotting import curdoc, figure
from bokeh.models import ColumnDataSource, Button
from bokeh.layouts import column
from bokeh.events import ButtonClick
source = ColumnDataSource(data=dict(x=[0, 1], y=[0, 0]))
doc = curdoc()
def button_pushed():
for i in range(10):
source.data = dict(x=[0, 1], y=[i, i])
sleep(0.5)
p = figure(plot_width=600, plot_height=300)
p.line(source=source, x='x', y='y')
button = Button(label='Draw')
button.on_event(ButtonClick, lambda: button_pushed())
doc.add_root(column(button, p))
将上述代码作为Bokeh应用程序,在回调完全执行后,该行只更新一次。您可以使用
asyncio
来完成此操作。在loop()
中进行计算,然后使用
doc.add\u next\u tick\u callback()
更新数据源
from functools import partial
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, Button
from bokeh.layouts import column
from bokeh.events import ButtonClick
from tornado.ioloop import IOLoop
import asyncio
def view(doc):
source = ColumnDataSource(data=dict(x=[0, 1], y=[0, 0]))
def update_source(new_data):
source.data = new_data
async def loop():
for i in range(10):
doc.add_next_tick_callback(partial(update_source, dict(x=[0, 1], y=[i, i**2])))
await asyncio.sleep(0.5)
def button_pushed():
IOLoop.current().spawn_callback(loop)
p = figure(plot_width=600, plot_height=300)
p.line(source=source, x='x', y='y')
button = Button(label='Draw')
button.on_event(ButtonClick, button_pushed)
doc.add_root(column(button, p))
show(view)
添加一些额外的上下文:当回调结束时,Python/JS状态是同步的,因此对回调内相同属性的多个更新对BokehJS是不可见的