I have the following small example script making use of numpy and bokeh:
import numpy as np
import bokeh.plotting as bp
from bokeh.objects import HoverTool
bp.output_file('test.html')
fig = bp.figure(tools="reset,hover")
x = np.linspace(0,2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
s1 = fig.scatter(x=x,y=y1,color='#0000ff',size=10,legend='sine')
s1.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
s2 = fig.scatter(x=x,y=y2,color='#ff0000',size=10,legend='cosine')
s2.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
bp.show()
The problem is that the hover tool only works for the cosine curve but not for the sine.
I know that one option would be to plot both series togehter and change the color of the cosine data points:
import numpy as np
import bokeh.plotting as bp
from bokeh.objects import HoverTool
bp.output_file('test.html')
fig = bp.figure(tools="reset,hover")
x = np.linspace(0,2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
x = np.array([x,x]).flatten()
y = np.array([y1,y2]).flatten()
blue = np.array('#0000ff').flatten()
red = np.array('#ff0000').flatten()
colors = np.array([blue.repeat(len(y1)),red.repeat(len(y1))]).flatten()
s1 = fig.scatter(x=x,y=y,color=colors,size=10,legend='sine & cosine')
s1.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
bp.show()
But then I loose the legend entry for the second color.
How do I manage to be able to hover over both data sets and see the corresponding tooltip?
Thanks!
Max
Edit: Note that the approach below is necessary only if you want different tooltips for different glyphs. If you want the same tooltips for all glyphs, see the answer above.
If you want to have multiple hover tools, you need to add multiple hover tools, each configured for a different renderer. You can add them this way:
p = figure()
r1 = p.circle([1,2,3], [4,5,6], color="blue")
p.add_tools(HoverTool(renderers=[r1], tooltips=TIPS))
r2 = p.square([4,5,6], [1,2,3], color="red")
p.add_tools(HoverTool(renderers=[r2], tooltips=TIPS))
The original answer was ancient and outdated, here is how to accomplish this with any modern version of Bokeh:
from bokeh.plotting import figure, show
import numpy as np
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
fig = figure(tools="reset", tooltips=[("x", "$x"), ("y", "$y")])
s1 = fig.scatter(x, y1, color='#0000ff', size=10, legend_label='sine')
s2 = fig.scatter(x, y2, color='#ff0000', size=10, legend_label='cosine')
show(fig)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With