Проблема
Я пытаюсь создать график рассеяния боке (используя данные из pandas.DataFrame
), где оси x
и y
могут быть изменены пользователем. Важно, чтобы это работало в ноутбуке Jupyter.
Мне удалось заставить что-то работать, но API-интерфейс bokeh для меня довольно новый. В приведенном ниже примере просто используется набор данных sklearn и он следует указаниям этого поста .
Пример ( Это должно работать при копировании в Jupyter )
import pandas as pd
import numpy as np
from bokeh.io import show, output_notebook
from bokeh.layouts import widgetbox,row
from bokeh.models import ColumnDataSource, CustomJS, DataRange1d
from bokeh.plotting import figure
from bokeh.models import LinearColorMapper
from bokeh.palettes import RdYlBu11 as palette
from bokeh.models.widgets import Select
from sklearn.datasets import load_boston
output_notebook()
boston = load_boston()
df = pd.DataFrame(data = boston['data'], columns = boston['feature_names'])
df['x'] = df.iloc[:, 0]
df['y'] = df.iloc[:, 1]
p = figure()
p.y_range, p.x_range = DataRange1d(range_padding=0.1), DataRange1d(range_padding=0.1)
source = ColumnDataSource(df)
p.scatter('x', 'y', source=source)
cols = df.columns.tolist()
y_select = Select(title="Select y:", value = cols[0], options = cols[:-2])
x_select = Select(title="Select x:", value = cols[0], options = cols[:-2])
y_callback = CustomJS(args={'source':source},code="""
var data = source.data;
data['y'] = data[cb_obj.value];
source.change.emit();
""")
x_callback = CustomJS(args={'source':source},code="""
var data = source.data;
data['x'] = data[cb_obj.value];
source.change.emit();
""")
# Add the callback to the select widget.
y_select.callback = y_callback
x_select.callback = x_callback
show(row(p, y_select, x_select))
Вопросы
- Правильно ли я считаю, что для создания интерактивных графиков в блокноте Jupyter необходимо определить
CustomJS
обратный вызовфункции? Или есть лучший способ для достижения вышеуказанного? - Необходимо ли указывать
p.y_range
и p.x_range
, как указано выше. Если я определю или x
или y
, оси все равно обновятся, как и ожидалось. Почему это происходит? - Следует ли определять функцию обратного вызова для каждой оси при создании раскрывающихся меню осей. Или можно использовать один обратный вызов для изменения оси
x
или y
?