Bokeh Plotting: Enable tooltips for only some glyphs Bokeh Plotting: Enable tooltips for only some glyphs python python

Bokeh Plotting: Enable tooltips for only some glyphs


Thanks to this page in Google Groups I figured out how this can be done. Link here

Edit 2015-10-20: looks like the google group link doesn't work anymore unfortunately. It was a message from Sarah Bird @bokehplot.

Edit 2017-01-18: Currently this would add multiple hover tool icons to the tool bar. This may cause problems. There is already an issue filed at github here. Alternatively, try @tterry's solution in the answer below.

Essentially you need to (bokeh version 0.9.2):

  1. not add hover in your tools when you create the figure
  2. create glyphs individually
  3. add glyphs to your figure
  4. set up the hover tool for this set of glyphs
  5. add the hover tool to your figure

Example:

import bokeh.models as bkmimport bokeh.plotting as bkpsource = bkm.ColumnDataSource(data=your_frame)p = bkp.figure(tools='add the tools you want here, but no hover!')g1 = bkm.Cross(x='col1', y='col2')g1_r = p.add_glyph(source_or_glyph=source, glyph=g1)g1_hover = bkm.HoverTool(renderers=[g1_r],                         tooltips=[('x', '@col1'), ('y', '@col2')])p.add_tools(g1_hover)# now repeat the above for the next sets of glyphs you want to add. # for those you don't want tooltips to show when hovering over, just don't # add hover tool for them!

Also if you need to add legend to each of the glyphs you are adding, try using bokeh.plotting_helpers._update_legend() method. github source Eg:

_update_legend(plot=p, legend_name='data1', glyph_renderer=g1_r)


You need to name your glyph with the name= attribute on the glyph that you are interested in having the hover tool active for and then set that name in the hover tool's names= attribute. (Note the name= attribute of the fig.line glyph in the example below.

hover = HoverTool( mode='vline', line_policy='nearest', names=['ytd_ave'],    tooltips=[        ("Week Number", "@WeekNumber"),        ("OH for the Week", "@OverHead{0.00}%"),        ("OH Average", "@AveOverHead{0.00}%"),        ("Non-Controllable Hours", "@NonControllableHours{0.0}"),        ("Controllable Hours", "@ControllableHours{0.0}"),        ("Total Hours", "@TotalHours{0.0}"),    ])fig = Figure(title='Weekly Overhead', plot_width=950, plot_height=400,         x_minor_ticks=2, tools=['pan', 'box_zoom', 'wheel_zoom', 'save',                                 'reset', hover])ch = fig.vbar('WeekNumber', top='ControllableHours', name='Over Head',          color='LightCoral', source=sources, width=.5)nch = fig.vbar('WeekNumber', bottom='ControllableHours', top='TotalOHHours',         name='Non-Controllable Over Head', color='LightGray',          source=sources, width=.5)bh = fig.vbar('WeekNumber', bottom='TotalOHHours', top='TotalHours',         name='Project Hours', color='LightGreen', source=sources,         width=.5)ave = fig.line('WeekNumber', 'AveOverHead', source=sources, color='red',         y_range_name='Percent_OH', name='ytd_ave')


Will Zhang's answer will work, but you would end up with multiple hover tools. If this is undesirable, you can add renderers to an existing hover tool:

from bokeh import plottingfrom bokeh.models import HoverTool, PanTool, ResetTool, WheelZoomToolhover_tool = HoverTool(tooltips=[('col', '@x'),('row', '@y')])  # instantiate HoverTool without its rendererstools = [hover_tool, WheelZoomTool(), PanTool(), ResetTool()]  # collect the tools in a list: you can still update hover_toolplot = plotting.figure(tools=tools)plot.line(x_range, y_range)  # we don't want to put tooltips on the line because they can behave a little strangescatter = plot.scatter(x_range, y_range)  # we assign this renderer to a name...hover_tool.renderers.append(scatter)  # ...so we can add it to hover_tool's renderers.

So the differences here:

  1. You can create your glyph in a high level way using the plotting interface and this will still work.
  2. You don't have to create a new HoverTool (unless you want different tooltips) each time, just add it to the existing tool's renderers.