2017-02-14 5 views
4

私はPythonでちょっと新しく、現在複数の関連するチャートを表示する必要があるBokehを使用した対話的なプロットの視覚化に取り組んでいます。これを達成するために私はbokehサーバーを使用しています。ツールからのBokehサーバーコールバック

私はドキュメントとsome examplesを読んできましたが、プロットの選択によってトリガされたpythonコールバック(サーバーで実行された)の例は見つかりませんでした。

from bokeh.plotting import figure, curdoc 
from bokeh.layouts import column 
from bokeh.models import ColumnDataSource 

TOOLS = "tap" 
p = figure(title="Some Figure", tools=TOOLS) 

source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]], y=[[2, 1, 4], [4, 7, 8, 5]], name=['A', 'B'])) 

p.patches('x', 'y', source=source, color=["firebrick", "navy"], alpha=[0.8, 0.3], line_width=2) 


def callback(): 
    print("TapTool callback executed on Patch {}") 


??? <- some code here linking the taptool with the callback function defined above 


curdoc().add_root(column(p)) 

し、サーバーを実行してパッチをクリック:

2017年2月14日16:32:0万TapToolコールバックが上の実行基本的に私は何をしたいのようなものですパッチA

この動作はbokehで実現できますか?次のように

答えて

5

selectedイベントがアップデート機能にリンクすることができます。

from bokeh.plotting import figure, curdoc 
from bokeh.layouts import column 
from bokeh.models import ColumnDataSource 

TOOLS = "tap" 
p = figure(title="Some Figure", tools=TOOLS) 

source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]], 
       y=[[2, 1, 4], [4, 7, 8, 5]], name=['A', 'B'])) 

pglyph = p.patches('x', 'y', source=source, color=["firebrick", "navy"], 
           alpha=[0.8, 0.3], line_width=2) 

def callback(attr, old, new): 
    # The index of the selected glyph is : new['1d']['indices'][0] 
    patch_name = source.data['name'][new['1d']['indices'][0]] 
    print("TapTool callback executed on Patch {}".format(patch_name)) 

pglyph.data_source.on_change('selected',callback) 

curdoc().add_root(column(p)) 
+0

偉大な実行時のエラーを得ました! finnallyそれが働いて、ありがとうございました。新しい['1d'] ['indices'] [0]が選択されたグリフのインデックスであることをどのように推測しますか? –

+0

さて、私は今この事を学んでいるので、多くの試行錯誤があり、bokeh GitHubリポジトリの例を調べています。この特定のケースでは、デバッグ中に変数を出力するのに役立ちました。 'print new' –

0

パブロによって公開ソリューションは素晴らしいですが、それは、最近のボケバージョン(0.12.13)では動作しません。私は...私のために作品に続き

(メソッドをグリフへユーザー定義のデータ・ソースと反復可能な値を供給することはことはできません

from bokeh.plotting import figure, curdoc 
from bokeh.layouts import column 
from bokeh.models import ColumnDataSource 

TOOLS = "tap" 
p = figure(title="Some Figure", tools=TOOLS) 

source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]], y=[[2, 1, 4], [4, 7, 8, 5]], alphas = [0.8, 0.3], colors=["firebrick", "navy"], name=['A', 'B'])) 

pglyph = p.patches(xs='x', ys='y', source=source, line_width=2, alpha = 'alphas', color='colors') 

def callback_fcn(attr, old, new): 
    # The index of the selected glyph is : new['1d']['indices'][0] 
    patch_name = source.data['name'][new['1d']['indices'][0]] 
    print("TapTool callback executed on Patch {}".format(patch_name)) 

pglyph.data_source.on_change('selected',callback_fcn) 

curdoc().add_root(column(p)) 
関連する問題