Невозможно обновить сюжет в Bokeh JS с ноутбуком Jupyter - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь перенести этот пример из Bokeh внутрь ноутбука (см. здесь исходный код)

Вот моя попытка:

import pandas as pd

from bokeh.layouts import row, widgetbox
from bokeh.models import Select
from bokeh.palettes import Spectral5
from bokeh.plotting import curdoc, figure

df = pandas.DataFrame({'A': [1.1, 2.7, 5.3], 'B': [2, 10, 9], 'C': [3.3, 5.4, 1.5], 'D': [4, 7, 15]},
                      index = ['a1', 'a2', 'a3'])

columns = sorted(df.columns)

def create_figure(x_v):
    xs = df[x_v].values
    ys = df[y.value].values
    x_title = x_v.title()
    y_title = y.value.title()

    kw = dict()
    kw['title'] = "%s vs %s" % (x_title, y_title)

    p = figure(plot_height=600, plot_width=800, tools='pan,box_zoom,hover,reset', **kw)
    p.xaxis.axis_label = x_title
    p.yaxis.axis_label = y_title


    sz = 9
    c = "#31AADE"
    p.circle(x=xs, y=ys, color=c, size=sz, line_color="white", alpha=0.6, hover_color='white', hover_alpha=0.5)

    return p

fig = create_figure('A')

def update(x_value):
    global fig
    global layout
    global bokeh_handle
    fig = create_figure(x_value)
    layout = row(controls, fig)
    push_notebook(handle=bokeh_handle) #doesn't update?

x = Select(title='X-Axis', value='A', options=columns)
x.js_on_change('value', CustomJS(code="""
if (IPython.notebook.kernel !== undefined) {
    var kernel = IPython.notebook.kernel;
    cmd = "update('" + cb_obj.value + "')";
    kernel.execute(cmd, {}, {});
}
"""))

controls = widgetbox([x], width=200)
layout = row(controls, fig)

bokeh_handle = show(layout, notebook_handle=True)

Это отображает мой график «A против B», но тогда график никогда не обновляется, когда я меняю выбранный виджет. Как я могу заставить это работать?

Что я вижу, так это то, что объект макета фактически изменился, потому что, если я вызову show(layout) в новой ячейке, он будет перерисовывать обновленный макет. Однако кажется, что я не корректно обновляю старый макет новым, так как новый никогда не меняется. Как я могу это исправить?

спасибо!

...