Я пытаюсь отобразить гистограмму и отфильтровываю содержимое объекта Select. Столь же простой, как кажется, я не смог найти рабочее решение после двух дней поиска. Мне нужно сделать это с Custom JS, а не с сервером bokeh.
Вот код, который я пробую, но когда я его запускаю, ничего не отображается, даже пустой график.
import pandas as pd
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, CustomJS, CustomJSFilter, CDSView, Select, IndexFilter
from bokeh.io import show, output_notebook
from bokeh.layouts import column
output_notebook()
df = pd.DataFrame({'Subject': ['Math', 'Math', 'Math', 'Science', 'Science', 'Science'],
'Class': ['Algebra', 'Calculus', 'Trigonometry', 'Biology', 'Chemistry', 'Physics'],
'FailRate': [0.05, 0.16, 0.31, 0.12, 0.20, 0.08]})
src = ColumnDataSource(df)
subj_list = sorted(list(set(src.data['Subject'])))
callback = CustomJS(args=dict(src=src), code='''
src.change.emit();
''')
js_filter = CustomJSFilter(code='''
var indices = [];
for (var i = 0; i < src.get_length(); i++){
if (src.data['Subject'][i] == select.value){
indices.push(true);
} else {
indices.push(false);
}
}
return indices;
''')
options = ['Please select...'] + subj_list
select = Select(title='Subject Selection', value=options[0], options=options)
select.js_on_change('value', callback)
view = CDSView(source=src, filters=[js_filter])
class_list = sorted(list(src.data['Class']))
p = figure(x_range=class_list, plot_height=400, plot_width=400)
p.vbar('Class', top='FailRate', width=0.9, source=src, view=view)
show(column(select, p))
Насколько я могу судить, часть проблемы связана с этой строкой (или переменной 'view'):
p.vbar('Class', top='FailRate', width=0.9, source=src, view=view)
До того, как я добавил 'view = view' в В приведенной выше строке я по крайней мере получал окно выбора и график, хотя взаимодействие не работало.