Skip to content

Commit

Permalink
Sort dynamic dimension values in widget constructor (#2654)
Browse files Browse the repository at this point in the history
  • Loading branch information
philippjfr authored and jlstevens committed May 7, 2018
1 parent 1317cc9 commit 482e96c
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 5 deletions.
7 changes: 6 additions & 1 deletion holoviews/core/spaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -807,8 +807,13 @@ def _initial_key(self):
for kdim in self.kdims:
if str(kdim) in stream_params:
key.append(None)
elif kdim.default:
key.append(kdim.default)
elif kdim.values:
key.append(kdim.values[0])
if all(util.isnumeric(v) for v in kdim.values):
key.append(sorted(kdim.values)[0])
else:
key.append(kdim.values[0])
elif kdim.range[0] is not None:
key.append(kdim.range[0])
else:
Expand Down
11 changes: 8 additions & 3 deletions holoviews/plotting/widgets/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,14 @@ def __init__(self, plot, renderer=None, **params):
self.renderer = renderer

# Create mock NdMapping to hold the common dimensions and keys
sorted_dims = []
for dim in self.dimensions:
if dim.values and all(isnumeric(v) for v in dim.values):
dim = dim.clone(values=sorted(dim.values))
sorted_dims.append(dim)
with item_check(False):
self.mock_obj = NdMapping([(k, None) for k in self.keys], kdims=list(self.dimensions),
sort=False)
self.mock_obj = NdMapping([(k, None) for k in self.keys],
kdims=sorted_dims, sort=False)

NdWidget.widgets[self.id] = self

Expand Down Expand Up @@ -386,7 +391,7 @@ def _get_dynamic_widget(cls, idx, dim):
# Widgets currently detect dynamic mode by type
# this value representation is now redundant
# and should be removed in a refactor
values = sorted(dim.values)
values = dim.values
dim_vals = {i: i for i, v in enumerate(values)}
widget_type = 'slider'
value_labels = escape_list(escape_vals([dim.pprint_value(v)
Expand Down
22 changes: 22 additions & 0 deletions tests/plotting/bokeh/testwidgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,3 +373,25 @@ def test_holomap_dropdown_bad_default(self):
hmap = HoloMap({chr(65+i): Curve([1, 2, 3]) for i in range(10)}, dim)
with self.assertRaises(ValueError):
bokeh_renderer.get_widget(hmap, 'widgets').get_widgets()

def test_dynamicmap_default_value_slider_plot_initialization(self):
dims = [Dimension('N', default=5, range=(0, 10))]
dmap = DynamicMap(lambda N: Curve([1, N, 5]), kdims=dims)
widgets = bokeh_renderer.get_widget(dmap, 'widgets')
widgets.get_widgets()
self.assertEqual(widgets.plot.current_key, (5,))

def test_dynamicmap_unsorted_numeric_values_slider_plot_initialization(self):
dims = [Dimension('N', values=[10, 5, 0])]
dmap = DynamicMap(lambda N: Curve([1, N, 5]), kdims=dims)
widgets = bokeh_renderer.get_widget(dmap, 'widgets')
widgets.get_widgets()
self.assertEqual(widgets.plot.current_key, (0,))

def test_dynamicmap_unsorted_numeric_values_slider_plot_update(self):
dims = [Dimension('N', values=[10, 5, 0])]
dmap = DynamicMap(lambda N: Curve([1, N, 5]), kdims=dims)
widgets = bokeh_renderer.get_widget(dmap, 'widgets')
widgets.get_widgets()
widgets.update((2,))
self.assertEqual(widgets.plot.current_key, (10,))
18 changes: 17 additions & 1 deletion tests/plotting/testplotutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import numpy as np

from holoviews import NdOverlay, Overlay
from holoviews import NdOverlay, Overlay, Dimension
from holoviews.core.spaces import DynamicMap, HoloMap
from holoviews.core.options import Store, Cycle
from holoviews.element.comparison import ComparisonTestCase
Expand Down Expand Up @@ -323,6 +323,22 @@ def test_dynamic_compute_overlayable_zorders_three_deep_dynamic_layers_reduced_l
self.assertNotIn(curve, sources[2])


class TestInitializeDynamic(ComparisonTestCase):

def test_dynamicmap_default_initializes(self):
dims = [Dimension('N', default=5, range=(0, 10))]
dmap = DynamicMap(lambda N: Curve([1, N, 5]), kdims=dims)
initialize_dynamic(dmap)
self.assertEqual(dmap.keys(), [5])

def test_dynamicmap_numeric_values_initializes(self):
dims = [Dimension('N', values=[10, 5, 0])]
dmap = DynamicMap(lambda N: Curve([1, N, 5]), kdims=dims)
initialize_dynamic(dmap)
self.assertEqual(dmap.keys(), [0])



class TestSplitDynamicMapOverlay(ComparisonTestCase):
"""
Tests the split_dmap_overlay utility
Expand Down

0 comments on commit 482e96c

Please sign in to comment.