Bokeh Interactive legend hide multiple glyphs Bokeh Interactive legend hide multiple glyphs pandas pandas

Bokeh Interactive legend hide multiple glyphs


It is not currently (Bokeh 0.12.6) possible to hide all the bars via legend.click_policy="hide", as stated in the 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

It is, however, possible to hide the bars by adding 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 npfrom bkcharts import Bar, showfrom bokeh.layouts import columnfrom bokeh.models import CheckboxGroup, CustomJSdata = {'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))