À Bokeh, Comment puis-je ajouter des tooltips à un chart des séries temporelles (outil hover)?

est-il possible d'ajouter des infobulles à un graphique de séries chronologiques?

dans l'exemple de code simplifié ci-dessous, je veux voir un nom de colonne simple ('a','b' ou 'c') lorsque la souris survole la ligne correspondante.

à la place, un"???"est affiché et les trois lignes obtiennent un bout d'outil (plutôt que celui qui plane)

enter image description here

selon la documentation ( http://bokeh.pydata.org/en/latest/docs/user_guide/tools.html#hovertool ), les noms de champ commençant par "@" sont interprétés comme des colonnes sur la source de données.

  1. Comment puis-je afficher les "colonnes" d'une base de données pandas dans le tooltip?

  2. ou, si l'interface des séries chronologiques de haut niveau ne supporte pas cela, des indices pour utiliser les interfaces de bas niveau pour faire la même chose? (la ligne? multi_line?) ou convertir le DataFrame dans un format différent (ColumnDataSource?)

  3. pour le crédit bonus, comment doit-on formater le "$x " pour afficher la date comme une date?

merci d'avance

    import pandas as pd
    import numpy as np
    from bokeh.charts import TimeSeries
    from bokeh.models import HoverTool
    from bokeh.plotting import show

    toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))   

    p = TimeSeries(toy_df, tools='hover')  

    hover = p.select(dict(type=HoverTool))
    hover.tooltips = [
        ("Series", "@columns"),
        ("Date", "$x"),
        ("Value", "$y"),
        ]

    show(p)
27
demandé sur maxymoo 2015-07-19 02:43:02

3 réponses

ci-dessous, c'est ce que j'ai trouvé.

ce n'est pas joli mais ça marche.

je suis encore nouveau pour le Bokeh (Et Python d'ailleurs) donc si quelqu'un veut proposer une meilleure façon de le faire, n'hésitez pas.

enter image description here

import pandas as pd
import numpy as np
from bokeh.charts import TimeSeries
from bokeh.models import HoverTool
from bokeh.plotting import show

toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))       

 _tools_to_show = 'box_zoom,pan,save,hover,resize,reset,tap,wheel_zoom'        

p = figure(width=1200, height=900, x_axis_type="datetime", tools=_tools_to_show)


# FIRST plot ALL lines (This is a hack to get it working, why can't i pass in a dataframe to multi_line?)   
# It's not pretty but it works. 
# what I want to do!: p.multi_line(df)
ts_list_of_list = []
for i in range(0,len(toy_df.columns)):
    ts_list_of_list.append(toy_df.index.T)

vals_list_of_list = toy_df.values.T.tolist()

# Define colors because otherwise multi_line will use blue for all lines...
cols_to_use =  ['Black', 'Red', 'Lime']
p.multi_line(ts_list_of_list, vals_list_of_list, line_color=cols_to_use)


# THEN put  scatter one at a time on top of each one to get tool tips (HACK! lines with tooltips not yet supported by Bokeh?) 
for (name, series) in toy_df.iteritems():
    # need to repmat the name to be same dimension as index
    name_for_display = np.tile(name, [len(toy_df.index),1])

    source = ColumnDataSource({'x': toy_df.index, 'y': series.values, 'series_name': name_for_display, 'Date': toy_df.index.format()})
    # trouble formating x as datestring, so pre-formating and using an extra column. It's not pretty but it works.

    p.scatter('x', 'y', source = source, fill_alpha=0, line_alpha=0.3, line_color="grey")     

    hover = p.select(dict(type=HoverTool))
    hover.tooltips = [("Series", "@series_name"), ("Date", "@Date"),  ("Value", "@y{0.00%}"),]
    hover.mode = 'mouse'

show(p)
10
répondu bs123 2015-07-21 21:27:22

Je ne suis pas familier avec les pandas. j'utilise juste la liste python pour montrer l'exemple même de comment ajouter des tooltips à muti_lines, afficher les noms de série ,et afficher correctement la date/heure.Ci-dessous est le résultat. Merci à la réponse de @bs123 et la réponse de @tterry dans Bokeh tracer: activer tooltips pour seulement quelques glyphes

mon résultat

# -*- coding: utf-8 -*-

from bokeh.plotting import figure, output_file, show, ColumnDataSource
from bokeh.models import  HoverTool
from datetime import datetime

dateX_str = ['2016-11-14','2016-11-15','2016-11-16']
#conver the string of datetime to python  datetime object
dateX = [datetime.strptime(i, "%Y-%m-%d") for i in dateX_str]

v1= [10,13,5]
v2 = [8,4,14]
v3= [14,9,6]
v = [v1,v2,v3]

names = ['v1','v2','v3']
colors = ['red','blue','yellow']

output_file('example.html',title = 'example of add tooltips to multi_timeseries')
tools_to_show = 'hover,box_zoom,pan,save,resize,reset,wheel_zoom'
p = figure(x_axis_type="datetime", tools=tools_to_show)

#to show the tooltip for multi_lines,you need use the ColumnDataSource which define the data source of glyph
#the key is to use the same column name for each data source of the glyph
#so you don't have to add tooltip for each glyph,the tooltip is added to the figure

#plot each timeseries line glyph
for i in xrange(3):
# bokeh can't show datetime object in tooltip properly,so we use string instead
    source = ColumnDataSource(data={
                'dateX': dateX, # python datetime object as X axis
                'v': v[i],
                'dateX_str': dateX_str, #string of datetime for display in tooltip
                'name': [names[i] for n in xrange(3)]
            })
    p.line('dateX', 'v',source=source,legend=names[i],color = colors[i])
    circle = p.circle('dateX', 'v',source=source, fill_color="white", size=8, legend=names[i],color = colors[i])

    #to avoid some strange behavior(as shown in the picture at the end), only add the circle glyph to the renders of hover tool
    #so tooltip only takes effect on circle glyph
    p.tools[0].renderers.append(circle)

# show the tooltip
hover = p.select(dict(type=HoverTool))
hover.tooltips = [("value", "@v"), ("name", "@name"), ("date", "@dateX_str")]
hover.mode = 'mouse'
show(p)

info-bulles avec un comportement étrange,les deux conseils affichées en même temps

5
répondu 能豆子 2017-05-23 12:34:17

voici ma solution. J'ai inspecté la source de données de rendu de glyphe pour voir quels sont les noms dessus. Alors j'utilise ces noms sur le bout des outils de hoover. Vous pouvez voir la parcelle ici .

import numpy as np
from bokeh.charts import TimeSeries
from bokeh.models import HoverTool
from bokeh.plotting import show

toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))   
#Bockeh display dates as numbers so convert to string tu show correctly
toy_df.index = toy_df.index.astype(str) 
p = TimeSeries(toy_df, tools='hover')  

#Next 3 lines are to inspect how are names on gliph to call them with @name on hover
#glyph_renderers = p.select(dict(type=GlyphRenderer))
#bar_source = glyph_renderers[0].data_source
#print(bar_source.data)  #Here we can inspect names to call on hover


hover = p.select(dict(type=HoverTool))
hover.tooltips = [
        ("Series", "@series"),
        ("Date", "@x_values"),
        ("Value", "@y_values"),
        ]

show(p)
0
répondu josale 2017-08-09 15:47:36