Чтобы выбрать некоторые точки на графике и получить их в блокноте Jupyter, вы можете использовать Пользовательский JS обратный вызов .
В пользовательском JS обратном вызове javascript код, вы можете получить доступ к ядру ноутбука Jupyter, используя IPython.notebook.kernel
. Затем вы можете использовать kernal.execute(python_code)
для запуска Python кода и (например) экспорта данных из вызова javascript в записную книжку Jupyter.
Таким образом, сервер bokeh не требуется для двусторонней связи связь между графиком боке и записной книжкой Jupyter.
Ниже я расширил ваш пример кода, добавив в него пользовательский обратный вызов JS, который срабатывает при событии геометрии выбора на рисунке. Всякий раз, когда делается выбор, обратный вызов запускается и экспортирует индексы выбранных точек данных в переменную в записной книжке Jupyter с именем selected_indices
.
Чтобы получить ColumnDataSource
, который содержит выбранные точки данных, кортеж selected_indices
проходит по циклу для создания списков выбранных значений x и y, которые затем передаются в конструктор ColumnDataSource
.
from random import random
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.models.sources import ColumnDataSource
from bokeh.models.callbacks import CustomJS
output_notebook()
x = [random() for x in range(1000)]
y = [random() for y in range(1000)]
s = ColumnDataSource(data=dict(x=x, y=y))
fig = figure(tools=['box_select', 'lasso_select', 'reset'])
fig.circle("x", "y", source=s, alpha=0.6)
# make a custom javascript callback that exports the indices of the selected points to the Jupyter notebook
callback = CustomJS(args=dict(s=s),
code="""
console.log('Running CustomJS callback now.');
var indices = s.selected.indices;
var kernel = IPython.notebook.kernel;
kernel.execute("selected_indices = " + indices)
""")
# set the callback to run when a selection geometry event occurs in the figure
fig.js_on_event('selectiongeometry', callback)
show(fig)
# make a selection using a selection tool
# inspect the selected indices
selected_indices
# use the indices to create lists of the selected values
x_selected, y_selected = [], []
for indice in selected_indices:
x_val = s.data['x'][indice]
y_val = s.data['y'][indice]
x_selected.append(x_val)
y_selected.append(y_val)
# make a column data souce containing the selected values
selected = ColumnDataSource(data=dict(x=x_selected, y=y_selected))
# inspect the selected data
selected.data