首页 > 解决方案 > 在 Bokeh javascript 回调中重新运行源

问题描述

想象一下Bokeh 文档中的这个例子:

# modified to by used in a notebook

from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_notebook, show

x = [x*0.005 for x in range(0, 200)]
y = x

source = ColumnDataSource(data=dict(x=x, y=y))

plot = Figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)

callback = CustomJS(args=dict(source=source), code="""
    var data = source.data;
    var f = cb_obj.value
    var x = data['x']
    var y = data['y']
    for (var i = 0; i < x.length; i++) {
        y[i] = Math.pow(x[i], f)
    }
    source.change.emit();
""")

slider = Slider(start=0.1, end=4, value=1, step=.1, title="power")
slider.js_on_change('value', callback)

layout = column(slider, plot)

show(layout)

y我想知道是否有办法在更改要用于笔记本下一个单元格中的其他计算的小部件之后使用(最近的)值。我想到的是y在回调中返回,但我对任何其他想法持开放态度。

标签: pythonbokeh

解决方案


如果您希望 Python 运行时和 JS 输出之间完全同步,则必须在笔记本中嵌入 Bokeh 服务器应用程序。(Bokeh 服务器专门负责使事物保持同步。)否则,Jupyter 笔记本中的所有输出都是单向的,Python -> JavaScript,没有更新返回到 Python 内核。

您可以在此处查看嵌入了 Bokeh 服务器应用程序的示例笔记本:

https://github.com/bokeh/bokeh/blob/master/examples/howto/server_embed/notebook_embed.ipynb


推荐阅读