Интерактивные панды. Построение Боке - PullRequest
0 голосов
/ 25 октября 2019

Проблема

Я пытаюсь создать график рассеяния боке (используя данные из 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))

Вопросы

  1. Правильно ли я считаю, что для создания интерактивных графиков в блокноте Jupyter необходимо определить CustomJS обратный вызовфункции? Или есть лучший способ для достижения вышеуказанного?
  2. Необходимо ли указывать p.y_range и p.x_range, как указано выше. Если я определю или x или y, оси все равно обновятся, как и ожидалось. Почему это происходит?
  3. Следует ли определять функцию обратного вызова для каждой оси при создании раскрывающихся меню осей. Или можно использовать один обратный вызов для изменения оси x или y?
...