Interactive legends¶
Legends added to Bokeh plots can be made interactive
so that clicking or tapping on the legend entries will hide or mute the
corresponding glyph in a plot. These modes are activated by setting the
click_policy
property on a Legend
to
either "hide"
or "mute"
.
Note
Interactive legends only work on “per-glyph” legends. Grouped legends do not yet support the features described below.
Hiding glyphs¶
Sometimes it is desirable to be able to hide glyphs by clicking on an entry
in a Legend
. In Bokeh this can be accomplished by setting the legend
click_policy
property to "hide"
as shown in the example below:
import pandas as pd
from bokeh.palettes import Spectral4
from bokeh.plotting import figure, output_file, show
from bokeh.sampledata.stocks import AAPL, GOOG, IBM, MSFT
p = figure(width=800, height=250, x_axis_type="datetime")
p.title.text = 'Click on legend entries to hide the corresponding lines'
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4):
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
p.line(df['date'], df['close'], line_width=2, color=color, alpha=0.8, legend_label=name)
p.legend.location = "top_left"
p.legend.click_policy="hide"
output_file("interactive_legend.html", title="interactive_legend.py example")
show(p)
Muting glyphs¶
Other times it is preferable for legend interaction to mute a glyph, instead
of hiding it entirely. In this case, set click_policy
property to
"mute"
. Additionally, the visual properties of a “muted glyph” also
need to be specified. In general, this is done in exactly the same way as for
Selected and unselected glyphs or
Hover inspections. In the example below,
muted_alpha=0.2
and muted_color=color
are passed to circle
to
specify that muted lines should be drawn with a low alpha muted glyph.
import pandas as pd
from bokeh.palettes import Spectral4
from bokeh.plotting import figure, show
from bokeh.sampledata.stocks import AAPL, GOOG, IBM, MSFT
p = figure(width=800, height=250, x_axis_type="datetime")
p.title.text = 'Click on legend entries to mute the corresponding lines'
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4):
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
p.line(df['date'], df['close'], line_width=2, color=color, alpha=0.8,
muted_color=color, muted_alpha=0.2, legend_label=name)
p.legend.location = "top_left"
p.legend.click_policy="mute"
show(p)