2017-09-22 3 views
0

Ich habe ein Streudiagramm mit einer Radiobuttongroup auf der Oberseite gebaut. Wie kann ich das Widget mit der Handlung verknüpfen? Das Resultat, das ich erreichen möchte, ist wie folgt:Bokeh Python, wie man mit Radiobuttons interagiert

wählen ‚one‘ - nur die Punkte zeigen, wenn ihre x-Wert gleich 1

‚zwei‘ wählen - nur die Punkte zeigen, wenn ihre x-Wert gleich 2

wählen ‚drei‘ - zeigt nur die Punkte, wenn ihr Wert x 3

gleich Hier ist mein Code so weit:

dataset = {'x':[0,1,2],'y':[0,1,2]} 

source2 = ColumnDataSource(data=dataset) 


p2 = figure(plot_width=600, plot_height=600, 
      x_range=(-0.1, 2.1), y_range=(-0.1,2.1)) 

p2.scatter('x', 'y', source=source2, 
      size=15, 
      alpha=0.8, 
      line_color=None) 

# option 
option = RadioButtonGroup(labels=["One", "Two", "Three"], active=0) 


show(column(option, p2)) 

Antwort

2

Das tut, was Sie suchen:

from bokeh.io import show 
from bokeh.models import ColumnDataSource, 
from bokeh.plotting import figure 
from bokeh.models.widgets import RadioButtonGroup 
from bokeh.layouts import column, widgetbox 
from bokeh.models.callbacks import CustomJS 

dataset = {'x':[0,1,2],'y':[0,1,2],'x_filter':[0,1,2]} 

source = ColumnDataSource(data=dataset) 
p = figure(plot_width=600, plot_height=600, 
      x_range=(-0.1, 2.1), y_range=(-0.1,2.1)) 
p.scatter('x', 'y', source=source, 
      size=15, alpha=0.8, line_color=None) 

# add callback to control 
callback = CustomJS(args=dict(p=p, source=source), code=""" 

      var radio_value = cb_obj.active; 
      var data = source.data;    
      x = data['x'] 
      x_filter = data['x_filter'] 
      y = data['y'] 

      for (i = 0; i < x.length; i++) { 
       if(x_filter[i] == radio_value) { 
        x[i] = x_filter[i]; 
       } else { 
        x[i] = undefined; 
       } 
      } 
     source.change.emit(); 
     """) 

# option 
option = RadioButtonGroup(labels=["One", "Two", "Three"], 
          active=0, callback=callback) 
show(column(widgetbox(option),p)) 

Der interessante Code ist in JavaScript. Grundsätzlich prüft es für jeden Punkt, ob die x-Koordinate des Punktes Ihrer RadioButton-Auswahl entspricht. Ist dies nicht der Fall, wird der Punkt als nicht vorhanden festgelegt. Dadurch verschwindet der Punkt in der Handlung. Eine neue Spalte x_filter wird zu Ihren Daten hinzugefügt. Es wird verwendet, um die Radio-Wahl mit Ihrem ursprünglichen x zu vergleichen. Die tatsächliche x wird zum Plotten verwendet.

+0

Vielen Dank. Dieser Code funktionierte ... teilweise ... Mein Graph aktualisiert sich nicht, nachdem ich auf den Radiobutton geklickt habe. Ich muss die Grafik ziehen und dann werden die Punkte korrekt angezeigt. Kennst du den Grund? Danke – AmadeusNing

+0

Welche Bokeh-Version verwendest du? Ich habe mit 0.12.6 getestet. Es sollte zumindest mit etwas neuerem funktionieren, denke ich. Welchen Browser benutzen Sie? Sie sollten auch versuchen, einen anderen zu verwenden. – mc51

+0

Danke mc51! Ich habe mein Bokeh auf 0.12.7 aktualisiert und das Problem gelöst. Danke noch einmal – AmadeusNing