带有 Bokeh 的依赖滑块,如何编写回调
Dependent Sliders with Bokeh, how to write the callbacks
我希望能够滑过许多图,这些图是 3+ 维度的模拟结果。我正在通过 Python.
使用 Bokeh 包
为简单起见,假设我有两个维度:d 和 nc。但是 nc 以下列方式依赖于 d:
if d=100, nc=56,57
if d=20, nc=5,6
我有4张图片:
d_100_nc_56.png,
d_100_nc_57.png,
d_20_nc_5.png,
d_20_nc_6.png
所以我想要两个滑块,一个用于 d,一个用于 nc,通过 [=] 循环 .png 图像40=] Bokeh.plotting.Figure 的函数。但是,当我在 d
中更改滑块时,nc 滑块的值应该会自行更新
from bokeh.io import vform
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_file, show
output_file('image.html')
source = ColumnDataSource(data=dict(url=['d_100_nc_55.png']))
p = Figure(x_range=(0,1), y_range=(0,1))
callback_nc = CustomJS(args=dict(source=source), code="""
var data = source.get('data');
var f = cb_obj.get('value')
old = data['url'][0]
to_replace=old.substring(old.lastIndexOf("nc_")+3,old.lastIndexOf(".png"))
data['url'][0] = old.replace(to_replace,f.toString(10))
source.trigger('change');
""")
callback_d = CustomJS(args=dict(source=source), code="""
var data = source.get('data');
var f = cb_obj.get('value')
old = data['url'][0]
to_replace=old.substring(old.lastIndexOf("d_")+2,old.lastIndexOf("_nc_"))
data['url'][0] = old.replace(to_replace,f.toString(10))
source.trigger('change');
""")
p.image_url('url',source=source, x=0, y=1,w=1,h=1)
p.text(x=0,y=0,text=source.data['url'])
slider_nc = Slider(start=55, end=65, value=1, step=1, title="nc", callback=callback_nc)
slider_d = Slider(start=20, end=100, value=100, step=80, title="density", callback=callback_d)
layout = vform(slider_nc,slider_d, p)
show(layout)
但是,我不知道如何将 d 滑块作为参数传递给 nc 滑块以获取其属性并更新他们在飞行中。这可能吗 ?否则,它会极大地限制通过散景使用多个滑块。
编辑:已更新为最新版本
传递滑块的方式与传递 source
的方式相同,作为 args
词典中的一项。您传递到那里的任何 Python 侧散景模型都会自动提供给回调。然后,BokehJS 模型属性与 reference guide 中描述的 python 属性完全匹配 这是一个根据另一个滑块更新滑块的示例:
# Example from Bokeh 0.12.x
from bokeh.plotting import show, output_file
from bokeh.layouts import column
from bokeh.models import CustomJS, Slider
s1 = Slider(start=1, end=10, value=1, step=1)
s2 = Slider(start=0, end=1, value=0, step=1)
s1.callback = CustomJS(args=dict(s1=s1, s2=s2), code="""
s2.end = s1.value;
""")
output_file("foo.html")
show(column(s1,s2))
我希望能够滑过许多图,这些图是 3+ 维度的模拟结果。我正在通过 Python.
使用 Bokeh 包为简单起见,假设我有两个维度:d 和 nc。但是 nc 以下列方式依赖于 d:
if d=100, nc=56,57
if d=20, nc=5,6
我有4张图片:
d_100_nc_56.png,
d_100_nc_57.png,
d_20_nc_5.png,
d_20_nc_6.png
所以我想要两个滑块,一个用于 d,一个用于 nc,通过 [=] 循环 .png 图像40=] Bokeh.plotting.Figure 的函数。但是,当我在 d
中更改滑块时,nc 滑块的值应该会自行更新from bokeh.io import vform
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_file, show
output_file('image.html')
source = ColumnDataSource(data=dict(url=['d_100_nc_55.png']))
p = Figure(x_range=(0,1), y_range=(0,1))
callback_nc = CustomJS(args=dict(source=source), code="""
var data = source.get('data');
var f = cb_obj.get('value')
old = data['url'][0]
to_replace=old.substring(old.lastIndexOf("nc_")+3,old.lastIndexOf(".png"))
data['url'][0] = old.replace(to_replace,f.toString(10))
source.trigger('change');
""")
callback_d = CustomJS(args=dict(source=source), code="""
var data = source.get('data');
var f = cb_obj.get('value')
old = data['url'][0]
to_replace=old.substring(old.lastIndexOf("d_")+2,old.lastIndexOf("_nc_"))
data['url'][0] = old.replace(to_replace,f.toString(10))
source.trigger('change');
""")
p.image_url('url',source=source, x=0, y=1,w=1,h=1)
p.text(x=0,y=0,text=source.data['url'])
slider_nc = Slider(start=55, end=65, value=1, step=1, title="nc", callback=callback_nc)
slider_d = Slider(start=20, end=100, value=100, step=80, title="density", callback=callback_d)
layout = vform(slider_nc,slider_d, p)
show(layout)
但是,我不知道如何将 d 滑块作为参数传递给 nc 滑块以获取其属性并更新他们在飞行中。这可能吗 ?否则,它会极大地限制通过散景使用多个滑块。
编辑:已更新为最新版本
传递滑块的方式与传递 source
的方式相同,作为 args
词典中的一项。您传递到那里的任何 Python 侧散景模型都会自动提供给回调。然后,BokehJS 模型属性与 reference guide 中描述的 python 属性完全匹配 这是一个根据另一个滑块更新滑块的示例:
# Example from Bokeh 0.12.x
from bokeh.plotting import show, output_file
from bokeh.layouts import column
from bokeh.models import CustomJS, Slider
s1 = Slider(start=1, end=10, value=1, step=1)
s2 = Slider(start=0, end=1, value=0, step=1)
s1.callback = CustomJS(args=dict(s1=s1, s2=s2), code="""
s2.end = s1.value;
""")
output_file("foo.html")
show(column(s1,s2))