2016-07-07 12 views
0

ウィジェットで選択された2つのインジケータのすべての値ペアをループする「再生」機能を備えたBokehのインタラクティブダッシュボードを実装しようとしています。Bokeh:ウィジェットの値に基づいて軸の範囲を更新しないダッシュボード

Screen cap of dashboard

ループが動作する間に、ダッシュボードは、ループの各ステップの軸の値をリセットします。ですから、私が必要とするのは、選択されたwidget.valueに基づいて軸の値を設定することです。この目的のために、私はインデックスとしてインジケータの名前と各インジケータの最小値/最大値を列として持つデータフレーム "ranges"を構築しました。コントロールの

アップデートはthusly仕事(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

これは実施例である:

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) 
関連する問題