Как получить интерактивное боке в блокноте Jupyter - PullRequest
0 голосов
/ 09 ноября 2018

Я готовлюсь к использованию bokeh для интерактивной онлайн-реализации некоторых моделей Python, которые я написал.

Шаг 1 - это понимание некоторых основных интерактивных примеров, но я не могу запустить вводные примерыИНТЕРАКТИВНО в блокноте Jupyter.Я надеюсь, что кто-то может исправить мое недопонимание того, что является копией-вставкой собственного примера кода bokeh.

Я знаю, что документация Bokeh не идеальна (я исправил устаревшую ссылку на bokeh.plotting.showвместо io.show), но я думаю, что базовая структура, которую я использую, должна быть близка к правильной.

код основан на: https://github.com/bokeh/bokeh/blob/master/examples/app/sliders.py https://bokeh.pydata.org/en/latest/docs/user_guide/notebook.html

############ START BOILERPLATE ############
#### Interactivity -- BOKEH
import bokeh.plotting.figure as bk_figure
from bokeh.io import curdoc, show
from bokeh.layouts import row, widgetbox
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Slider, TextInput
from bokeh.io import output_notebook # enables plot interface in J notebook
# init bokeh
output_notebook()
############ END BOILERPLATE ############

# Set up data
N = 200
x = np.linspace(0, 4*np.pi, N)
y = np.sin(x)
source = ColumnDataSource(data=dict(x=x, y=y))

# Set up plot
plot = bk_figure(plot_height=400, plot_width=400, title="my sine wave",
              tools="crosshair,pan,reset,save,wheel_zoom",
              x_range=[0, 4*np.pi], y_range=[-2.5, 2.5])

plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)

# Set up widgets
text = TextInput(title="title", value='my sine wave')
offset = Slider(title="offset", value=0.0, start=-5.0, end=5.0, step=0.1)
amplitude = Slider(title="amplitude", value=1.0, start=-5.0, end=5.0, step=0.1)
phase = Slider(title="phase", value=0.0, start=0.0, end=2*np.pi)
freq = Slider(title="frequency", value=1.0, start=0.1, end=5.1, step=0.1)

# Set up callbacks
def update_title(attrname, old, new):
    plot.title.text = text.value

text.on_change('value', update_title)

def update_data(attrname, old, new):
    # Get the current slider values
    a = amplitude.value
    b = offset.value
    w = phase.value
    k = freq.value

    # Generate the new curve
    x = np.linspace(0, 4*np.pi, N)
    y = a*np.sin(k*x + w) + b

    source.data = dict(x=x, y=y)
    ### I thought I might need a show() here, but it doesn't make a difference if I add one
    # show(layout)

for w in [offset, amplitude, phase, freq]:
    w.on_change('value', update_data)


# Set up layouts and add to document
inputs = widgetbox(text, offset, amplitude, phase, freq)
layout = row(plot,
             widgetbox(text, offset, amplitude, phase, freq))
curdoc().add_root(row(inputs, layout, width=800))
curdoc().title = "Sliders"

show(layout)

Я создаю график, как показано ниже, но рисунок не обновляется при перемещении ползунков (и при обновлении текста заголовка) The static plot, teasing us with its sliders

Большое спасибо за любые предложения,

PS.Я пытаюсь сохранить этот код как можно ближе к тому, что я могу реализовать с помощью файлов .py на сервере, избегая тем самым обходных путей, специфичных для jupyter, таких как push_notebook.

1 Ответ

0 голосов
/ 09 ноября 2018

Вы смотрите на пример сервера для bokeh, взгляните на репозиторий bokeh notebook , в частности, учебник по связыванию . Есть блокнот, посвященный взаимодействиям , посмотрите на ячейку [10].

...