Bokeh tracer: activer les infobulles pour seulement quelques glyphes

j'ai une figure avec quelques glyphes, mais je veux seulement des tooltips à afficher pour certains glyphes. Y a-t-il actuellement un moyen d'y parvenir à Bokeh?

alternativement, y a-t-il un moyen de tracer deux figures l'une sur l'autre? On dirait que ça me permettrait d'accomplir ce que je veux faire.

14
demandé sur Imaduck 2015-04-03 18:35:04

4 réponses

grâce à cette page dans Google Groups j'ai compris comment cela peut être fait. ici

Edit 2015-10-20 : on dirait que le lien google group ne fonctionne plus malheureusement. C'était un message de Sarah Bird @bokehplot.

Edit 2017-01-18 : actuellement, cela ajouterait plusieurs icônes d'outils de vol stationnaire à la barre d'outils. Cela peut causer des problèmes. Il y a déjà un question déposé sur github ici . Alternativement, essayez la solution de @tterry dans la réponse ci-dessous.

essentiellement vous avez besoin de (bokeh version 0.9.2):

  1. n'ajoutez pas hover dans votre tools lorsque vous créez la figure
  2. créer des glyphes individuellement
  3. ajouter des glyphes à votre figure
  4. configurer l'outil de vol stationnaire pour cet ensemble de glyphes
  5. ajouter l'outil de vol stationnaire à votre chiffre

exemple:

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!

Aussi, si vous avez besoin d'ajouter une légende à chacune des glyphes que vous ajoutez, essayez d'utiliser bokeh.plotting_helpers._update_legend() la méthode. github source par exemple:

_update_legend(plot=p, legend_name='data1', glyph_renderer=g1_r)
11
répondu WillZ 2017-01-18 22:12:52

la réponse de Will Zhang fonctionnera, mais vous finirez avec plusieurs outils de vol stationnaire. Si cela n'est pas souhaitable, vous pouvez ajouter des rendus à un outil de vol stationnaire existant:

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.

de Sorte que les différences ici:

  1. vous pouvez créer votre glyphe à un niveau élevé en utilisant l'interface plotting et cela fonctionnera toujours.
  2. vous n'avez pas à créer un nouvel HoverTool (sauf si vous voulez chaque fois, il suffit de l'Ajouter aux rendus de l'outil existant.
8
répondu tterry 2017-05-23 12:34:28

Hover N'est pas actuellement supporté pour les glyphes de type image et les glyphes de ligne. Ainsi, l'utilisation de l'un de ces glyphes en combinaison avec des glyphes qui soutiennent la pointe de l'outil de vol stationnaire, pourrait être un travail autour.

voir: http://bokeh.pydata.org/en/latest/docs/user_guide/objects.html#hovertool

2
répondu dyingoptimist 2015-04-06 05:29:01

Vous devez nommer votre glyphe avec le name= attribut sur le glyphe que vous êtes intéressé à avoir le placez l'outil, et ensuite de définir ce nom dans le placez l'outil names= attribut. (Notez l'attribut name= du glyphe fig.line dans l'exemple ci-dessous.

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')
1
répondu Nickleman 2017-05-03 12:08:54