2015-04-03 16 views
11

Ich habe eine Figur mit einigen Glyphen, möchte aber nur Tooltips für bestimmte Glyphen anzeigen. Gibt es derzeit einen Weg, dies in Bokeh zu erreichen?Bokeh-Plotten: Tooltips nur für einige Glyphen aktivieren

Oder gibt es eine Möglichkeit, zwei Figuren übereinander zu zeichnen? Es scheint so, als ob ich damit erreichen könnte, was ich tun möchte.

Antwort

11

Dank dieser Seite in Google Groups ich herausgefunden, wie dies geschehen kann. Link here

bearbeiten 2015.10.20: sieht aus wie die Google-Gruppe Link leider nicht mehr funktioniert. Es war eine Nachricht von Sarah Bird @bokeplot.

Bearbeiten 2017-01-18: Derzeit würde mehrere Hover Tool-Symbole in der Symbolleiste hinzufügen. Dies kann zu Problemen führen. Es gibt bereits ein Problem bei GitHub here. Versuchen Sie alternativ @ tertry's Lösung in der Antwort unten.

Im Wesentlichen müssen Sie (Bokeh Version 0.9.2):

  1. nicht hover in Ihrem tools hinzufügen, wenn Sie die Figur
  2. erstellen Glyphen erstellen individuell
  3. Glyphen zu Ihrer Figur hinzufügen
  4. Richten Sie das Hover-Tool für diesen Glyphensatz ein
  5. Fügen Sie das Hover-Tool zu Ihrer Figur hinzu

Beispiel:

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! 

Auch wenn Sie Legende zu jedem der Glyphen hinzufügen müssen Sie hinzufügen, versuchen bokeh.plotting_helpers._update_legend() Methode. github source ZB:

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

Nur eine Anmerkung, wenn Sie dies tun, dass die Tooltips nicht respektieren einander Raum, die Tooltips werden einander überlappen, wenn Sie zufällig über zwei verschiedene Glyphen gleichzeitig sind sie respektieren einander Raum? – Guillochon

+0

Ja, ich habe das auch bemerkt TBH Ich habe nicht ti ausgegeben Wenn Sie sich dieses Thema anschauen, würden Sie gerne hören, ob jemand eine Lösung hat. – WillZ

1

Hover wird derzeit nicht für Bildtyp-Glyphen und Linienglyphen unterstützt. Also, eine dieser Glyphen in Kombination mit Glyphen zu verwenden, die Hover Tool Tip unterstützen, könnte ein Problem sein.

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

+0

Ja, ich darüber nachgedacht, aber es gibt einfach keine Möglichkeit, es zu tun, wenn ich eine Handlung als Zahl speichern will, dann über sie zeichnen, Das ist wirklich hacky. – Imaduck

+0

@Imaduck Das wird ein großartiges Feature in Bokeh Ich denke, ich versuche, das gleiche zu tun, aber Tool Tipps tauchen für die Glyphen, die ich nicht brauche (aber immer noch wollen (in der Tabelle zu sehen) .. – WillZ

7

Will Zhang's answer funktionieren wird, aber Sie würden mit mehreren Hover-Tools am Ende. Wenn dies nicht erwünscht ist, können Sie Renderer zu einem bestehenden Hover-Tool hinzuzufügen:

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 sind die Unterschiede hier:

  1. Sie Ihre Glyphe in hohem Niveau erstellen können, mit der plotting Schnittstelle und diesen Willen funktioniert noch immer.
  2. Sie müssen nicht jedes Mal ein neues HoverTool erstellen (es sei denn, Sie möchten verschiedene Tooltips), fügen Sie es einfach zu den Renderern des vorhandenen Werkzeugs hinzu.
+0

Einfach unglaublich !! – denvar

+0

Ja, das ist ein Problem, ich habe es erst kürzlich bemerkt. Es gibt bereits ein Problem in github, das diese Hover-Tools potenziell gruppiert. https://github.com/bokeh/bokeh/issues/5497 – WillZ

+1

@WillZ Ich denke, dass die aktuelle Implementierung in Ordnung ist, hat nur eine gotcha um versehentlich eine Tonne von Werkzeugen zu erstellen. Ich kann mir einige Fälle vorstellen, in denen zwei Glyphen auf demselben Plot von verschiedenen Tooltips profitieren würden. – tterry

0

Sie benötigen eine Glyphe mit dem name= Attribute auf der Glyphe zu nennen, dass Sie das Hover-Werkzeug aktiv in mit Interesse und stellen Sie dann den Namen in dem names= Attribute der Hover-Tool. (Beachten Sie das name= Attribut des fig.line Glyphe im Beispiel unten.

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') 
Verwandte Themen