我正在尝试显示条形图,并用Select对象过滤内容。看起来似乎很简单,但经过两天的寻找,我仍无法找到可行的解决方案。我需要使用CustomJS,而不是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'添加到上面的行之前,即使交互不起作用,我至少会显示一个选择框和图。
我正在尝试显示条形图,并用Select对象过滤内容。看起来似乎很简单,但经过两天的寻找,我仍无法找到可行的解决方案。我需要做...
Bokeh可以神奇地跨运行时传输您的Python对象,使其在浏览器中显示为JavaScript对象,但是神奇之处是有限的。您必须通过向args
对象提供CustomJS
参数来准确地告诉Bokeh要传输的哪个