2015-12-08 7 views
5

ボケに散布図があり、ボックス選択ツールが有効になっている場合は、ボックス選択ツールでいくつかの点を選択したとします。選択したポイントの(x、y)位置情報にアクセスするにはどうすればよいですか?Bokehのボックス選択ツールに含まれる選択データを取得

%matplotlib inline 
import numpy as np 
from random import choice 
from string import ascii_lowercase 

from bokeh.models.tools import * 
from bokeh.plotting import * 

output_notebook() 


TOOLS="pan,wheel_zoom,reset,hover,poly_select,box_select" 
p = figure(title = "My chart", tools=TOOLS) 
p.xaxis.axis_label = 'X' 
p.yaxis.axis_label = 'Y' 

source = ColumnDataSource(
    data=dict(
     xvals=list(range(0, 10)), 
     yvals=list(np.random.normal(0, 1, 10)), 
     letters = [choice(ascii_lowercase) for _ in range(10)] 
    ) 
) 
p.scatter("xvals", "yvals",source=source,fill_alpha=0.2, size=5) 

select_tool = p.select(dict(type=BoxSelectTool))[0] 

show(p) 

# How can I know which points are contained in the Box Select Tool? 

"コールバック"属性を呼び出すことはできず、 "dimensions"属性はリスト["width"、 "height"]を返します。選択したボックスの寸法と位置を取得できるだけであれば、そこからデータセット内のポイントを特定できます。

あなたが選択したデータのインデックスを持つPythonの変数を更新 ColumnDataSourcecallbackを使用することができます

答えて

9

%matplotlib inline 
import numpy as np 
from random import choice 
from string import ascii_lowercase 

from bokeh.models.tools import * 
from bokeh.plotting import * 
from bokeh.models import CustomJS 



output_notebook() 


TOOLS="pan,wheel_zoom,reset,hover,poly_select,box_select" 
p = figure(title = "My chart", tools=TOOLS) 
p.xaxis.axis_label = 'X' 
p.yaxis.axis_label = 'Y' 

source = ColumnDataSource(
    data=dict(
     xvals=list(range(0, 10)), 
     yvals=list(np.random.normal(0, 1, 10)), 
     letters = [choice(ascii_lowercase) for _ in range(10)] 
    ) 
) 
p.scatter("xvals", "yvals",source=source,fill_alpha=0.2, size=5) 

select_tool = p.select(dict(type=BoxSelectTool))[0] 

source.callback = CustomJS(args=dict(p=p), code=""" 
     var inds = cb_obj.get('selected')['1d'].indices; 
     var d1 = cb_obj.get('data'); 
     console.log(d1) 
     var kernel = IPython.notebook.kernel; 
     IPython.notebook.kernel.execute("inds = " + inds); 
     """ 
) 

show(p) 

その後、あなたは所望のデータが

zip([source.data['xvals'][i] for i in inds], 
    [source.data['yvals'][i] for i in inds]) 
+0

恐ろしいようなものを使用して属性にアクセスすることができます! CustomJSを "Callback"に変更しなければなりませんでした(まだバージョン0.9.0を持っています)。あなたの助けをありがとう、本当に便利です。 –

+1

@FrankFineis:うれしい! upvote(三角形をクリック)し、答えを受け入れて(チェックマークをクリックして) "未回答"リストから質問を削除します(そして、インターネットポイント '=)') – Jake

関連する問題