2016-11-10 1 views
3

Я хочу использовать виджеты bokeh из ноутбука jupyter для обновления графика боке. Мой (несколько Hacky) код выглядит следующим образом:Обновление участка боке с виджетами bokeh в ноутбуке jupyter

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) 

Идея заключается в том, что обратный вызов JS для слайдера вызывает функцию питона update_plot(), которая изменяет данные о боке участка, а затем запускающее push_notebook().

Однако, когда я перемещаю ползунок, участок не обновляется, но some weird glyphs appear in the upper left corner (see red arrow).

Выполнение print(plt.data_source.data['y']) показало мне, что обратный вызов и update_plot() были фактически вызваны движением ползунка. Почему сюжет не обновляется должным образом? Или я чего-то не хватает?

(я знаю, что я могу сделать то же самое, используя ipywidgets.interact, но я хочу, чтобы придерживаться боке виджетов.)

+0

я могу воспроизвести это, кажется, что там может быть проблема с обновлением событий (то есть 'push_notebook') ближайшие маршевые во время другой текущей обработки событий (ползунок обратного вызова). «Странный глиф» на самом деле весь сюжет сократился до минимального размера холста (думаю, 20x20px). Я бы посоветовал представить эту информацию по [GitHub вопрос трекер] (https://github.com/bokeh/bokeh/issues). – bigreddot

+0

Thx, проблема [вопрос вверх] (https://github.com/bokeh/bokeh/issues/5452) – joergd

ответ

3

Я получил участок для обновления, как и ожидалось, показывая фигуру и ползунок виджета в пределах bokeh.layouts.row расположение:

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) 
Смежные вопросы