Bokeh Interactive 图例隐藏多个字形

Bokeh Interactive legend hide multiple glyphs

我为我的数据集启用了隐藏图例选项。当我单击它时,只有一个条会熄灭,而其他条会保留。我不太确定是什么导致了这个问题。

这是之前和之后的条形图:

.

这是我的数据:

代码如下:

p = Bar(output,'Programs',values="Averages", group="University",plot_width=600,plot_height=400, title="Comparison")
p.legend.click_policy="hide"
output_file("bar.html")
show(p)

目前 (Bokeh 0.12.6) 无法通过 legend.click_policy="hide" 隐藏所有条形图,如 documentation:

中所述

Interactive legend features currently work on “per-glyph” legends. Legends that are created by specifying a column to automatically group do no yet work with the features described below

但是,可以通过添加 CheckboxGroup() with CustomJS that hides the bars when the checkboxes are clicked. Below you can see an MCVE, which is also available online as a Jupyter Notebook:

来隐藏条形图
import numpy as np
from bkcharts import Bar, show
from bokeh.layouts import column
from bokeh.models import CheckboxGroup, CustomJS

data = {'University': ['ENGT'] * 3 + ['UBC'] * 3,
        'Averages': [76.5, 79.9, 72.2, 71, 72, 69],
        'Programs': ['CHML', 'CIVL', 'CPEN', 'CHML', 'CIVL', 'CPEN']}

group = "University"
bars = Bar(data=data, label='Programs', values="Averages", group=group,
           plot_width=600, plot_height=400, title="Comparison")

checkboxes = CheckboxGroup(labels=np.unique(data[group]).tolist(),
                           # Make all checkboxes checked by default
                           active=list(range(np.unique(data[group]).size)))
checkboxes.callback = CustomJS(args=dict(bars=bars), code="""

var group = '%s';

function change_bars_visibility(checkbox_name, visible) {
    for (j = 0; j < bars.renderers.length; j++) {
        // Go through rendered objects

        if (bars.renderers[j].attributes.hasOwnProperty('data_source') && 
            bars.renderers[j].data_source.data[group][0] === checkbox_name) {

            // Change the visibility of this rendered object if it belongs to
            // the group determined by the checkbox that was clicked
            bars.renderers[j].visible = visible;
        }
    }
}

for (i = 0; i < cb_obj.labels.length; i++) {
    // Go through checkbox labels
    var checkbox_name = cb_obj.labels[i];

    if (cb_obj.active.indexOf(i) >= 0) {
        // alert(checkbox_name + " is activated");
        change_bars_visibility(checkbox_name, true);
    }
    else {
        // alert(checkbox_name + " is disabled");
        change_bars_visibility(checkbox_name, false);
    }
}
""" % group)

show(column(bars, checkboxes))