Skip to content

Commit

Permalink
Merge pull request #1178 from ioam/hover_points_fixes
Browse files Browse the repository at this point in the history
Small fixes for hover tools
  • Loading branch information
jlstevens committed Mar 6, 2017
2 parents 45afc6e + ba2f939 commit c80f986
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
11 changes: 9 additions & 2 deletions holoviews/plotting/bokeh/chart.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,20 +103,27 @@ def get_data(self, element, ranges=None, empty=False):

def get_batched_data(self, element, ranges=None, empty=False):
data = defaultdict(list)
for key, el in element.items():
for key, el in element.data.items():
style = self.lookup_options(el, 'style')
style = style.max_cycles(len(self.ordering))
self.set_param(**self.lookup_options(el, 'plot').options)
eldata, elmapping = self.get_data(el, ranges, empty)
for k, eld in eldata.items():
data[k].append(eld)

nvals = len(data[k][-1])
if 'color' not in elmapping:
zorder = self.get_zorder(element, key, el)
val = style[zorder].get('color')
elmapping['color'] = 'color'
if isinstance(val, tuple):
val = rgb2hex(val)
data['color'].append([val]*len(data[k][-1]))
data['color'].append([val]*nvals)

if any(isinstance(t, HoverTool) for t in self.state.tools):
for dim, k in zip(element.dimensions(), key):
sanitized = dimension_sanitizer(dim.name)
data[sanitized].append([k]*nvals)
data = {k: np.concatenate(v) for k, v in data.items()}
return data, elmapping

Expand Down
12 changes: 7 additions & 5 deletions holoviews/plotting/bokeh/element.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ def _hover_opts(self, element):
else:
dims = list(self.overlay_dims.keys())
dims += element.dimensions()
return dims, {}
return list(util.unique_iterator(dims)), {}

def _init_tools(self, element, callbacks=[]):
"""
Expand Down Expand Up @@ -249,13 +249,15 @@ def _get_hover_data(self, data, element, empty=False):
if not any(isinstance(t, HoverTool) for t in self.state.tools):
return

for d in element.dimensions(label=True):
sanitized = util.dimension_sanitizer(d)
data[sanitized] = [] if empty else element.dimension_values(d)
for d in element.dimensions():
dim = util.dimension_sanitizer(d.name)
if dim not in data:
data[dim] = element.dimension_values(d)

for k, v in self.overlay_dims.items():
dim = util.dimension_sanitizer(k.name)
data[dim] = [v for _ in range(len(list(data.values())[0]))]
if dim not in data:
data[dim] = [v for _ in range(len(list(data.values())[0]))]


def _axes_props(self, plots, subplots, element, ranges):
Expand Down
8 changes: 8 additions & 0 deletions tests/testplotinstantiation.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,14 @@ def _test_hover_info(self, element, tooltips, line_policy='prev'):
self.assertEqual(hover[0].tooltips, tooltips)
self.assertEqual(hover[0].line_policy, line_policy)

def test_points_overlay_hover_batched(self):
obj = NdOverlay({i: Points(np.random.rand(10,2)) for i in range(5)},
kdims=['Test'])
opts = {'Points': {'tools': ['hover']},
'NdOverlay': {'legend_limit': 0}}
obj = obj(plot=opts)
self._test_hover_info(obj, [('Test', '@Test'), ('x', '@x'), ('y', '@y')])

def test_curve_overlay_hover_batched(self):
obj = NdOverlay({i: Curve(np.random.rand(10,2)) for i in range(5)},
kdims=['Test'])
Expand Down

0 comments on commit c80f986

Please sign in to comment.