From 5ade52f2b2be9ecc26f15c85846c0d953aa26ea4 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Sat, 23 Feb 2019 13:48:14 +0000 Subject: [PATCH 1/2] Implement datetime hover for Raster/Image types --- holoviews/plotting/bokeh/raster.py | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/holoviews/plotting/bokeh/raster.py b/holoviews/plotting/bokeh/raster.py index ce0020da0a..3da5f3dd7f 100644 --- a/holoviews/plotting/bokeh/raster.py +++ b/holoviews/plotting/bokeh/raster.py @@ -3,6 +3,8 @@ import numpy as np import param +from bokeh.models import DatetimeAxis, CustomJSHover + from ...core.util import cartesian_product, dimension_sanitizer, isfinite from ...element import Raster, RGB, HSV from .element import ElementPlot, ColorbarPlot @@ -34,6 +36,36 @@ def _hover_opts(self, element): tooltips.append((vdim.pprint_label, '@{0}'.format(vname))) return tooltips, {} + def _postprocess_hover(self, renderer, source): + super(RasterPlot, self)._postprocess_hover(renderer, source) + hover = self.handles.get('hover') + if not isinstance(hover.tooltips, list): + return + + element = self.current_frame + xdim, ydim = [dimension_sanitizer(kd.name) for kd in element.kdims] + xaxis = self.handles['xaxis'] + yaxis = self.handles['yaxis'] + + code = """ + var {ax} = special_vars.{ax}; + var date = new Date({ax}); + return date.toISOString().slice(0, 19).replace('T', ' ') + """ + tooltips, formatters = [], dict(hover.formatters) + for (name, formatter) in hover.tooltips: + if isinstance(xaxis, DatetimeAxis) and formatter == '$x': + xhover = CustomJSHover(code=code.format(ax='x')) + formatters['$x'] = xhover + formatter += '{custom}' + if isinstance(yaxis, DatetimeAxis) and formatter == '$y': + yhover = CustomJSHover(code=code.format(ax='y')) + formatters['$y'] = yhover + formatter += '{custom}' + tooltips.append((name, formatter)) + hover.tooltips = tooltips + hover.formatters = formatters + def __init__(self, *args, **kwargs): super(RasterPlot, self).__init__(*args, **kwargs) if self.hmap.type == Raster: From af0724f7c292b1cb44f226a44cc50e99e3e6b40b Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Sat, 23 Feb 2019 14:17:07 +0000 Subject: [PATCH 2/2] Minor fix --- holoviews/plotting/bokeh/raster.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/holoviews/plotting/bokeh/raster.py b/holoviews/plotting/bokeh/raster.py index 3da5f3dd7f..5c25eae7a1 100644 --- a/holoviews/plotting/bokeh/raster.py +++ b/holoviews/plotting/bokeh/raster.py @@ -39,7 +39,7 @@ def _hover_opts(self, element): def _postprocess_hover(self, renderer, source): super(RasterPlot, self)._postprocess_hover(renderer, source) hover = self.handles.get('hover') - if not isinstance(hover.tooltips, list): + if not (hover and isinstance(hover.tooltips, list)): return element = self.current_frame