Bokeh-使用Select小部件和CustomJS更新图

问题描述 投票:0回答:1

我正在尝试显示条形图,并用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对象过滤内容。看起来似乎很简单,但经过两天的寻找,我仍无法找到可行的解决方案。我需要做...

javascript python pandas callback bokeh
1个回答
0
投票

Bokeh可以神奇地跨运行时传输您的Python对象,使其在浏览器中显示为JavaScript对象,但是神奇之处是有限的。您必须通过向args对象提供CustomJS参数来准确地告诉Bokeh要传输的哪个

© www.soinside.com 2019 - 2024. All rights reserved.