是否可以同时具有内部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
。
在我看来,您要在问题中描述两个完全独立的问题。
当某些属性更改时,您将无法在JS和Python中都运行回调。给定您的代码,答案很明显-您正在使用show
创建静态HTML文档。为了运行Python代码,您需要bokeh serve
或更复杂的解决方案:https://docs.bokeh.org/en/latest/docs/user_guide/server.html#single-module-format
在某些情况下,您不能同时更新数据和基于该数据更新y_scale
。由于您没有提供有关如何更改y_scale
的任何详细信息,因此我无法真正以任何有用的方式回答它-您的代码从未提及过它。为了使回答这个问题成为可能,请更新问题中的代码示例或仅提出一个新问题