可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a figure with some glyphs, but only want tooltips to display for certain glyphs. Is there currently a way to accomplish this in Bokeh?
Alternatively, is there a way to plot two figures on top of each other? It seems like that would let me accomplish what I want to do.
回答1:
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):
- not add
hover
in your tools
when you create the figure - create glyphs individually
- add glyphs to your figure
- set up the hover tool for this set of glyphs
- add the hover tool to your figure
Example:
import bokeh.models as bkm import bokeh.plotting as bkp source = 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)
回答2:
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 plotting from bokeh.models import HoverTool, PanTool, ResetTool, WheelZoomTool hover_tool = HoverTool(tooltips=[('col', '@x'),('row', '@y')]) # instantiate HoverTool without its renderers tools = [hover_tool, WheelZoomTool(), PanTool(), ResetTool()] # collect the tools in a list: you can still update hover_tool plot = 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 strange scatter = 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:
- You can create your glyph in a high level way using the
plotting
interface and this will still work. - 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.
回答3:
Hover is not currently supported for image type glyphs and line glyphs. So, using one of these glyphs in combination with glyphs that support hover tool tip, might be a work around.
See: http://bokeh.pydata.org/en/latest/docs/user_guide/objects.html#hovertool
回答4:
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')