обновление графика боке с помощью виджета боке в блокноте jupyter

Я хочу использовать виджеты боке из блокнота 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 для ползунка вызывает функцию python update_plot(), которая изменяет данные графика боке, а затем вызывает push_notebook().

Однако, когда я перемещаю ползунок, график не обновляется, а появляются странные символы в левом верхнем углу (см. красную стрелку) .

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

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

4 голоса | спросил joergd 10 42016vEurope/Moscow11bEurope/MoscowThu, 10 Nov 2016 20:12:24 +0300 2016, 20:12:24

1 ответ


0

Я получил график для обновления, как и ожидалось, отобразив рисунок и виджет слайдера в макете 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)
ответил joergd 22 Jam1000000amSun, 22 Jan 2017 00:26:58 +030017 2017, 00:26:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132