当数据通过回调可用时,如何更新Bokeh服务器?

时间:2019-06-12 18:57:51

标签: python callback bokeh

我对事件循环/回调一般来说还是很陌生。我正在使用这种服务器方法,因此根据另一篇文章,我可以轻松地在Pycharm中运行它。

我想绘制迭代算法的结果,以优化物理笔式绘图仪的gcode路径(TS问题)。

因此,一旦算法周期完成,我就需要散景图进行更新。这是一个基于其他帖子的脚本,该脚本在触发滑块回调时会更新数据。作为真实数据的替代品,它会生成随机值。

import numpy as np
from bokeh.application import Application
from bokeh.application.handlers import FunctionHandler
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.server.server import Server
from tornado.ioloop import IOLoop

io_loop = IOLoop.current()


def getData():
    l = 50
    x = np.random.rand(1, l)
    y = np.random.rand(1, l)
    return (dict(x=x, y=y))


def modify_doc(doc):
    source = ColumnDataSource(data=getData())

    plot = figure()
    plot.line('x', 'y', source=source)

    slider = Slider(start=1, end=10, value=1, step=0.1)

    def callback(attr, old, new):
        source.data = getData()

    slider.on_change('value', callback)

    doc.add_root(column(slider, plot))


bokeh_app = Application(FunctionHandler(modify_doc))

server = Server({'/': bokeh_app}, io_loop=io_loop)
server.start()

if __name__ == '__main__':
    print('Opening Bokeh application on http://localhost:5006/')
    io_loop.add_callback(server.show, "/")
    io_loop.start()

但是,我无法确定在哪里放置循环/回调来每个循环更新一次绘图,而不是基于滑块的输入。应该是这样的

best-solution = []

for i in range(100):
    run slow algorithm on best-solution
    find best-result
    update plot with best-result
    best-solution = best-result

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

要启动任何任意代码,您可以将按钮与代码一起使用,以在按钮回调中运行。

def modify_doc(doc):
    source = ColumnDataSource(data=getData())

    def do_stuff():

        for i in range(100):

            ... do_stuff with the data ...

            source.data = data

    button = Button(label='do stuff')
    button.on_click(do_stuff)    

    plot = figure()
    plot.line('x', 'y', source=source)

    doc.add_root(column(button, plot))