我正在尝试为我们大学创建一个数据仪表板,并且在显示方式方面遇到了问题。我正在使用Bokeh和Python创建一些交互式图形。单击复选框选择专业学院时,我的复选框组未更新。我曾尝试更改几项,但无法弄清楚我在做什么错。
我的代码:
# Available college list
available_colleges = list(df['College'].unique())
source_maj = ColumnDataSource(df)
grouped_maj = df.groupby('Major').sum()
source_maj = ColumnDataSource(grouped_maj)
major = source_maj.data['Major'].tolist()
p_maj = figure(x_range=major, width=1100, height=500)
p_maj.xaxis.major_label_orientation = math.pi/4
color_map = factor_cmap(field_name='Major',
palette=Magma11, factors=level)
p_maj.vbar(x='Major', top='AY2018_19', source=source_maj, width=0.2, color=color_map)
p_maj.title.text ='Enrollment by Major'
p_maj.xaxis.axis_label = 'Major'
p_maj.yaxis.axis_label = 'Enrolled Students'
hover = HoverTool()
hover.tooltips = [
("2019-2020", "@AY2019_20"),
("2018-2019", "@AY2018_19"),
("2017-2018", "@AY2017_18")]
hover.mode = 'vline'
callback = CustomJS(args=dict(source=source_maj), code="""
const labels = cb_obj.labels;
const active = cb_obj.active;
const data = source_maj.data;
const sourceLen = data.combined.length;
const combined = Array(sourceLen).fill(undefined);
if (active.length > 0) {
const selectedColumns = labels.filter((val, ind) => active.includes(ind));
for(let i = 0; i < sourceLen; i++) {
let sum = 0;
for(col of selectedColumns){
sum += Major[col][i];
}
combined[i] = sum;
}
}
Major.combined=combined;
source_maj.change.emit();
""")
colleges_selection = CheckboxGroup(labels=available_colleges, active = [0], callback=callback)
controls = WidgetBox(colleges_selection)
p_maj = row(controls, p_maj)
数据在正在读取的csv表中格式化
非常感谢您的帮助。
您可能希望观看浏览器发送到javascript控制台的输出;它会告诉您这里出了什么问题。
[几个地方开始:您对CustomJS对象的参数引入了python对象'source_maj'并将其重命名为'source',但是在您的JS代码中,您将其称为'source_maj'。另外,您的JS代码引用了“主要”,但这不是JS知道的对象(即,它不是与args一起引入的)。