diff --git a/holoviews/element/raster.py b/holoviews/element/raster.py index dcdc2fb07d..d08200fe05 100644 --- a/holoviews/element/raster.py +++ b/holoviews/element/raster.py @@ -246,7 +246,7 @@ class Image(Dataset, Raster, SheetCoordinateSystem): of a string or dimension object.""") vdims = param.List(default=[Dimension('z')], - bounds=(1, 1), doc=""" + bounds=(1, None), doc=""" The dimension description of the data held in the matrix.""") rtol = param.Number(default=None, doc=""" diff --git a/holoviews/plotting/bokeh/raster.py b/holoviews/plotting/bokeh/raster.py index 47b2c48e6a..e03e64cf17 100644 --- a/holoviews/plotting/bokeh/raster.py +++ b/holoviews/plotting/bokeh/raster.py @@ -27,8 +27,11 @@ def _hover_opts(self, element): xdim, ydim = element.kdims tooltips = [(xdim.pprint_label, '$x'), (ydim.pprint_label, '$y')] if bokeh_version >= '0.12.16' and not isinstance(element, (RGB, HSV)): - vdim = element.vdims[0] - tooltips.append((vdim.pprint_label, '@image')) + vdims = element.vdims + tooltips.append((vdims[0].pprint_label, '@image')) + for vdim in vdims[1:]: + vname = dimension_sanitizer(vdim.name) + tooltips.append((vdim.pprint_label, '@{0}'.format(vname))) return tooltips, {} def __init__(self, *args, **kwargs): @@ -38,40 +41,46 @@ def __init__(self, *args, **kwargs): def get_data(self, element, ranges, style): mapping = dict(image='image', x='x', y='y', dw='dw', dh='dh') - val_dim = [d for d in element.vdims][0] + val_dim = element.vdims[0] style['color_mapper'] = self._get_colormapper(val_dim, element, ranges, style) if self.static_source: return {}, mapping, style - img = element.dimension_values(2, flat=False) - if img.dtype.kind == 'b': - img = img.astype(np.int8) - if type(element) is Raster: l, b, r, t = element.extents if self.invert_axes: l, b, r, t = b, l, t, r - else: - img = img.T else: l, b, r, t = element.bounds.lbrt() if self.invert_axes: - img = img.T l, b, r, t = b, l, t, r if self.invert_xaxis: l, r = r, l - img = img[:, ::-1] if self.invert_yaxis: - img = img[::-1] b, t = t, b dh, dw = t-b, r-l + data = dict(x=[l], y=[b], dw=[dw], dh=[dh]) + + for i, vdim in enumerate(element.vdims, 2): + if i > 2 and 'hover' not in self.handles: + continue + img = element.dimension_values(i, flat=False) + if img.dtype.kind == 'b': + img = img.astype(np.int8) + if 0 in img.shape: + img = np.array([[np.NaN]]) + if ((self.invert_axes and not type(element) is Raster) or + (not self.invert_axes and type(element) is Raster)): + img = img.T + if self.invert_xaxis: + img = img[:, ::-1] + if self.invert_yaxis: + img = img[::-1] + key = 'image' if i == 2 else dimension_sanitizer(vdim.name) + data[key] = [img] - if 0 in img.shape: - img = np.array([[np.NaN]]) - - data = dict(image=[img], x=[l], y=[b], dw=[dw], dh=[dh]) return (data, mapping, style)