散景:仪表板不会根据窗口小部件值更新轴范围

时间:2016-07-07 04:39:12

标签: python-2.7 bokeh

我正在尝试在Bokeh中使用" play"来实现交互式仪表板。循环遍历窗口小部件选择的两个指示符的所有值对的函数。

Screen cap of dashboard

当循环工作时,仪表板会重置循环每个步骤的轴值。所以我需要的是根据所选的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"])

应该发生什么:每当我更改小部件的值时,范围应该更新,但除此之外,它们应该保持不变

会发生什么:范围是根据最初设置的小部件的值设置的,并且在更新时不会更改。

我试图找到尝试实现类似但没有运气的例子。

1 个答案:

答案 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)