如何使用外部JavaScript代码访问和更新Bokeh绘图或小部件



我有一个Bokeh图,它由时间Bokeh滑块控制。我试图通过单击按钮将滑块的时间和相应的绘图数据设置为浏览器的当前时间。

如果所有东西都是完全用JS开发的,我知道如何做同样的事情。但我正在编写一个嵌入HTML文件中的外部JS函数,我不知道如何访问Bokeh对象(在本例中为Slider(并操作它们。我只能使用回调函数从滑块开始并更改底层数据,但不能使用其他方法。我需要使用按钮将滑块的值设置为当前时间!

callback = CustomJS( JS Code to cahnge the data; )
Timeslider = DateSlider(start=dt(2019, 9, 1, 16, 0, 0), end=dt(2019, 9, 2, 8, 0, 0), value=dt(2019, 9, 1, 16, 0, 0), step=1) 
callback.args['time_slider'] = Timeslider
Timeslider.js_on_change('value', callback)

您可以在Bokeh模板的block postamble部分嵌入另一个JS库,如下所述。然后,如果你给你的滑块一个名字,你可以这样访问它:

Python:

slider = Slider(start=0, end=10, value=5, name='my_slider')

JS:

var slider = Bokeh.documents[0].get_model_by_name('my_slider')
console.log('slider value before:', slider.value)
slider.value = 10
console.log('slider value after:', slider.value)

这是假设您的应用程序中只有一个Bokehdocument(注意documents[0]中的0索引(。然后,您可以像在CustomJS回调中一样访问和操作Slider对象,但请注意,cb_objcb_data在这种情况下不可用。

参见以下完整的工作示例(Bokeh v1.3.0(:

external_js.py:

from bokeh.io import save
from bokeh.models import Slider, Column
from bokeh.util.browser import view
template = """
{% block postamble %}
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
$(document).ready(function() {
var slider = Bokeh.documents[0].get_model_by_name('my_slider')
console.log('slider value before:', slider.value)
slider.value = 10
console.log('slider value after:', slider.value)
});
</script>
{% endblock %}
"""
slider = Slider(start=0, end=10, value=5, name='my_slider')
save(Column(slider), template=template)
view("external_js.html")

最新更新