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 hovers over the relevant line.
Instead, a "???" is displayed and ALL three lines get a tool tip (rather than just the one im hovering over)
Per the documentation ( http://docs.bokeh.org/en/latest/docs/user_guide/tools.html#hovertool), field names starting with “@” are interpreted as columns on the data source.
How can I display the 'columns' from a pandas DataFrame in the tooltip?
Or, if the high level TimeSeries interface doesn't support this, any clues for using the lower level interfaces to do the same thing? (line? multi_line?) or convert the DataFrame into a different format (ColumnDataSource?)
For bonus credit, how should the "$x" be formatted to display the date as a date?
thanks in advance
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)
The hover tool displays tooltips associated with individual glyphs. You can configure these tooltips to activate in different ways with a mode property: "mouse" only when the mouse is directly over a glyph.
Zoom In. Bokeh can be achieved at any focal length, but if you're struggling to get a strong bokeh effect, try zooming in more, or using a lens with a longer focal length. If zooming in means you can't fit your subject in the frame, move further away from your subject and re-shoot.
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With