In Bokeh, how do I add tooltips to a Timeseries chart (hover tool)?

前端 未结 4 1457
半阙折子戏
半阙折子戏 2020-12-08 14:03

Is it possible to add Tooltips to a Timeseries chart?

In the simplified code example below, I want to see a single column name (\'a\',\'b\' or \'c\') when the mouse

4条回答
  •  抹茶落季
    2020-12-08 14:33

    Below is what I came up with.

    Its not pretty but it works.

    Im still new to Bokeh (& Python for that matter) so if anyone wants to suggest a better way to do this, please feel free.

    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)
    

提交回复
热议问题