2016-11-10 9 views
3

Ich möchte Bokeh Widgets aus einem jupyter Notebook verwenden, um ein Bokeh Grundstück zu aktualisieren. My (etwas hacky) Code sieht wie folgt aus:Aktualisieren Bokeh Grundstück mit einem Bokeh Widget in Jupiter Notebook

from bokeh.plotting import figure 
from bokeh.io import output_notebook, push_notebook, show 
from bokeh.models import CustomJS, Slider 

output_notebook() 

power = 0.5 
x = [1,2,3] 
y = [i**power for i in x] 

fig = figure() 
plt = fig.circle(x, y) 

def update_plot(power): 
    x = plt.data_source.data['x'] 
    plt.data_source.data['y'] = [i**power for i in x] 
    push_notebook(handle=bokeh_handle) 


bokeh_handle = show(fig, notebook_handle=True) 

##### new notebook cell ##### 

callback = CustomJS(code=""" 
if (IPython.notebook.kernel !== undefined) { 
    var kernel = IPython.notebook.kernel; 
    cmd = "update_plot(" + cb_obj.value + ")"; 
    kernel.execute(cmd, {}, {}); 
} 
""") 

slider = Slider(start=0.1, 
       end=1, 
       value=1, 
       step=.05, 
       title="power", 
       callback=callback) 
show(slider) 

Die Idee ist, dass die JS Rückruf für den Schieber ruft die Python-Funktion update_plot(), die die Daten der Bokeh-Plot ändert und löst dann einen push_notebook(). Wenn ich den Schieberegler verschiebe, wird das Diagramm nicht aktualisiert, sondern some weird glyphs appear in the upper left corner (see red arrow).

Ausführung print(plt.data_source.data['y']) zeigte mir, dass der Callback und update_plot() eigentlich Slider Bewegung aufgerufen wurden. Warum wird der Plot nicht korrekt aktualisiert? Oder verpasse ich hier etwas?

(Ich weiß, dass ich die gleiche Sache ipywidgets.interact mit tun kann, aber ich möchte halten Widgets Bokeh.)

+0

ich dies nicht wiedergeben kann, wie es scheint, könnte es ein Problem mit Update-Ereignissen (zB 'push_notebook') kommenden Flugs einer anderen laufenden Ereignisverarbeitung (der Schieber Rückruf) zu sein. Die "komische Glyphe" ist eigentlich die gesamte Handlung, die auf die minimale Leinwandgröße geschrumpft ist (20x20px, denke ich). Ich würde vorschlagen, ein Problem mit diesen Informationen im [GitHub Issue Tracker] (https://github.com/bokeh/bokeh/issues) zu hinterlegen. – bigreddot

+0

Thx, das [Problem ist hoch] (https://github.com/bokeh/bokeh/issues/5452) – joergd

Antwort

3

bekam ich den Plot zu aktualisieren, da durch die Anzeige der Zahl und den Slider Widget innerhalb eines bokeh.layouts.row erwartet Layout:

from bokeh.plotting import figure 
from bokeh.io import output_notebook, push_notebook, show 
from bokeh.models import CustomJS, Slider 
from bokeh.layouts import row 

output_notebook() 

power = 0.5 
x = [1,2,3] 
y = [i**power for i in x] 

fig = figure() 
plt = fig.circle(x, y) 

def update_plot(power): 
    x = plt.data_source.data['x'] 
    plt.data_source.data['y'] = [i**power for i in x] 
    push_notebook(handle=bokeh_handle) 


##### new notebook cell ##### 

callback = CustomJS(code=""" 
if (IPython.notebook.kernel !== undefined) { 
    var kernel = IPython.notebook.kernel; 
    cmd = "update_plot(" + cb_obj.value + ")"; 
    kernel.execute(cmd, {}, {}); 
} 
""") 

slider = Slider(start=0.1, 
       end=1, 
       value=1, 
       step=.05, 
       title="power", 
       callback=callback) 
bokeh_handle = show(row(fig, slider), notebook_handle=True)