2015-12-08 10 views
5

Wenn ich ein Streudiagramm in Bokeh habe und das Boxauswahl-Werkzeug aktiviert habe, nehme ich an, dass ich einige Punkte mit dem Boxauswahl-Werkzeug auswähle. Wie kann ich auf die (x, y) Positionsinformationen der von mir ausgewählten Punkte zugreifen?Ausgewählte Daten im Box-Auswahlwerkzeug in 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? 

Ich kann das Attribut nicht nennen „Rückruf“ und das „Dimensionen“ Attribut gibt nur eine Liste [ „Breite“, „Höhe“]. Wenn ich nur die Dimensionen und die Position der Selected Box ermitteln kann, kann ich herausfinden, welche Punkte sich in meinem Dataset befinden.

Antwort

9

Sie können eine callback auf dem ColumnDataSource verwenden, die mit den Indizes der ausgewählten Daten ein Python-Variable aktualisiert:

%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) 

Dann können Sie die gewünschten Daten zugreifen Attribute etwas mit wie

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

Ehrfürchtig ! Ich musste nur CustomJS zu "Rückruf" ändern (habe noch Version 0.9.0). Danke für deine Hilfe, wirklich nützlich. –

+1

@FrankFineis: Schön, dass es hilft! Fühlen Sie sich frei, zu upvoten (indem Sie auf das Dreieck klicken) und akzeptieren Sie die Antwort (indem Sie auf das Häkchen klicken), um die Frage aus der "unbeantworteten" Liste zu entfernen (und mir einige Internet-Punkte zu geben =) ') – Jake