我正在尝试在Bokeh中使用" play"来实现交互式仪表板。循环遍历窗口小部件选择的两个指示符的所有值对的函数。
当循环工作时,仪表板会重置循环每个步骤的轴值。所以我需要的是根据所选的widget.value设置轴值。为此,我建立了一个数据框"范围"将指标的名称作为索引,将每个指标的最小/最大值作为列。
控件的更新因此起作用(x_axis等是小部件的名称):
controls = [x_axis, y_axis, start_yr, end_yr, years]
for control in controls:
control.on_change('value', lambda attr, old, new: update())
更新函数应该在控件更改时更新范围,如下所示:
def update():
p.x_range = Range1d(start = ranges.loc[x_axis.value,"Min"],
end = ranges.loc[x_axis.value,"Max"])
p.y_range = Range1d(start = ranges.loc[y_axis.value,"Min"],
end = ranges.loc[y_axis.value,"Max"])
应该发生什么:每当我更改小部件的值时,范围应该更新,但除此之外,它们应该保持不变
会发生什么:范围是根据最初设置的小部件的值设置的,并且在更新时不会更改。
我试图找到尝试实现类似但没有运气的例子。
答案 0 :(得分:0)
这是一个有效的例子:
import numpy as np
from bokeh.plotting import figure
from bokeh.models import Range1d
from bokeh.io import curdoc
x = np.linspace(0, 100, 1000)
y = np.sin(x)
p = figure(x_range=(0, 100))
p.circle(x, y)
def cb():
# this works:
p.x_range.start += 1
p.x_range.end += 1
# this also works:
#p.x_range = Range1d(p.x_range.start+1, p.x_range.end+1)
curdoc().add_periodic_callback(cb, 200)
curdoc().add_root(p)