Bokeh混合回调函数

问题描述 投票:0回答:1

是否可以同时具有内部update()函数和js回调附加到Bokeh中的滑块。

例如,下面的代码是Bokeh示例之一:

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

output_file("js_on_change.html")

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)

我想做的是具有更新功能:

def update():
    # Read a new bit of data.
    # Some pandas stuff.
    # source.data = new_data

所以我可以拥有:

# This will run a JS based callback.
slider.js_on_change('value', callback)

# This will run an internal function to fetch new piece of data.
slider.on_change('value', lambda attr, old, new: update())

所以我既可以更新基础数据,也可以执行JS事件。这可能吗?

-编辑---

只需添加GIF文件即可演示该问题。您可以看到JS回调不断拟合并更新情节的y_scale以使所有蜡烛都适合情节。

但是,当下拉菜单切换到另一个值时,不会触发y_scale回调。只有在我们开始拖动之后,js回调才会启动并适应y_scale

enter image description here

python bokeh
1个回答
0
投票

在我看来,您要在问题中描述两个完全独立的问题。

  1. 当某些属性更改时,您将无法在JS和Python中都运行回调。给定您的代码,答案很明显-您正在使用show创建静态HTML文档。为了运行Python代码,您需要bokeh serve或更复杂的解决方案:https://docs.bokeh.org/en/latest/docs/user_guide/server.html#single-module-format

  2. 在某些情况下,您不能同时更新数据和基于该数据更新y_scale。由于您没有提供有关如何更改y_scale的任何详细信息,因此我无法真正以任何有用的方式回答它-您的代码从未提及过它。为了使回答这个问题成为可能,请更新问题中的代码示例或仅提出一个新问题

© www.soinside.com 2019 - 2024. All rights reserved.