2016-07-14 13 views
7

Slider.on_changeコールバックを使用してグラフを更新するSliderウィジェットでBokehアプリケーションを使用しています。しかし、スライダの更新は私のコールバック関数が処理できるよりもずっと速く来ているので、着信する変更要求を抑制する方法が必要です。この問題は、スライド中にスライダがコールバックに呼び出され、最後のスライダ値(ユーザがマウスを離したとき)のみが重要です。Bokehアプリケーションのスロットル

私はこの問題にどのように対処できますか?

答えて

11

リリース0.12現在のところ、これは達成するにはやっかいですが、不可能ではありません。スライダーには"mouseup"というポリシーがありますが、現在はCustomJSコールバックにのみ適用されます。私は、これは理想的ではない、言ったように

from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.plotting import figure 
from bokeh.models.callbacks import CustomJS 
from bokeh.models.sources import ColumnDataSource 
from bokeh.models.widgets import Slider 

# this is the real callback that we want to happen on slider mouseup 
def cb(attr, old, new): 
    print("UPDATE", source.data['value']) 

# This data source is just used to communicate/trigger the real callback 
source = ColumnDataSource(data=dict(value=[])) 
source.on_change('data', cb) 

# a figure, just for example 
p = figure(x_range=(0,1), y_range=(0,1)) 

# add a slider with a CustomJS callback and a mouseup policy to update the source 
slider = Slider(start=1, end=10, value=1, step=0.1, callback_policy='mouseup') 
slider.callback = CustomJS(args=dict(source=source), code=""" 
    source.data = { value: [cb_obj.value] } 
""") 

curdoc().add_root(column(slider, p)) 

# make sure to add the source explicitly 
curdoc().add_root(source) 

:それは「偽」のデータソースと結合された場合は、私たちは最後の値を通信し、トリガすることができます。将来的にこの状況を改善する可能性のある機能要求がいくつかあります。しかし、チームは非常に小さいので、あなたが貢献する能力を持っているならば、躊躇しないでください(新しい貢献者だけが新機能の開発を加速するのを助けることができます)

+0

ありがとうございます。最後に報告された値に従ってグラフを更新するワーカースレッドを作成するとどうなりますか?それとも、スレッドセーフティの問題を導入するのでしょうか?その場合、グラフを更新するために使用できる反復タイマーを設定できますか? (スライダーの更新に起因するだけでなく、より長時間の作業を予期するため、ちょっと考えているから) – Emile

+1

これはおそらくうまくいくかもしれませんが、[スレッドからの更新](http:// bokeh .pydata.org/ja/0.12.0/docs/user_guide/server.html#updating-from-threads) – bigreddot

+0

この問題はBokeh 12.6で解決されましたか? – Thornhale