Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bokeh:在一个Python回调中多次更新figure_Python_Bokeh - Fatal编程技术网

Bokeh:在一个Python回调中多次更新figure

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

我想在一个Python回调中多次更新一个图。作为一个简单的例子,比如说在点击一个按钮后,我想改变一条线的坐标10次,每次都会在短时间内显示改变后的线。如果您愿意,可以将其称为动画

在Bokeh文档中,我只找到了

以下是一个不起作用的示例,说明了我想要的:

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是不可见的