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))