当轴范围发生变化时,我尝试使用回调函数在Bokeh服务器图中生成新数据。原则上这很好用:我使用p.x_range.on_change('end', my_callback_function)
将必要的函数附加到绘图中,执行my_callback_function
并更新绘图。
我面临的问题是回调函数可能需要很长时间才能完成。如果用户在my_callback_function
仍在运行时平移绘图或缩放几个步骤,则会触发更多on_change
个事件,并且对my_callback_function
的新调用会堆积起来。在用户停止平移或缩放后,这会导致绘图更新很长时间。
如果执行新的调用,有没有办法取消执行回调函数?或者是否可以指定一次只能对回调函数进行一次调用?
我尝试在功能运行时通过在p.x_range.remove_on_change('end', my_callback_function)
开头设置my_callback_function
来停用回叫,但显然在调用my_callback_function
之前不会发生停用完成:新的电话仍在堆积。
以下是一个小例子:将其保存为test.py
并使用bokeh serve test.py --show
执行
import bokeh.plotting
import numpy
import time
def generate_data(start, end):
time.sleep(1)
newx = numpy.linspace(start + 0.1 * (end - start), end - 0.1 * (end - start), 10)
newy = numpy.random.rand(10)
return newx, newy
def my_callback_function(param, old, new):
# I tried deactivating the callback once it's running...
# p.x_range.remove_on_change('end', my_callback_function)
x, y = generate_data(p.x_range.start, p.x_range.end)
ds.data = {
'x': x,
'y': y
}
# ... and activating it again when done, but that doesn't work, the function calls still pile up
# p.x_range.on_change('end', my_callback_function)
x, y = generate_data(0, 10)
p = bokeh.plotting.figure(x_range=[0, 10])
l = p.line(x, y)
ds = l.data_source
p.x_range.on_change('end', my_callback_function)
bokeh.plotting.curdoc().add_root(p)