I am making a plot following the example found here
Unfortunately, I have 17 curves I need to display, and the legend overlaps them. I know I can create a legend object that can be displayed outside the plot area like here, but I have 17 curves so using a loop is much more convenient.
Do you know how to combine both methods?
Advertisement
Answer
Ok, I found the solution. See the code below where I have just modified the interactive legend example:
JavaScript
x
29
29
1
import pandas as pd
2
from bokeh.palettes import Spectral4
3
from bokeh.plotting import figure, output_file, show
4
from bokeh.sampledata.stocks import AAPL, IBM, MSFT, GOOG
5
from bokeh.models import Legend
6
from bokeh.io import output_notebook
7
8
output_notebook()
9
10
p = figure(plot_width=800, plot_height=250, x_axis_type="datetime", toolbar_location='above')
11
p.title.text = 'Click on legend entries to mute the corresponding lines'
12
13
legend_it = []
14
15
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4):
16
df = pd.DataFrame(data)
17
df['date'] = pd.to_datetime(df['date'])
18
c = p.line(df['date'], df['close'], line_width=2, color=color, alpha=0.8,
19
muted_color=color, muted_alpha=0.2)
20
legend_it.append((name, [c]))
21
22
23
legend = Legend(items=legend_it)
24
legend.click_policy="mute"
25
26
p.add_layout(legend, 'right')
27
28
show(p)
29