From b4f2b537dfada6815e3b3d22063d39854392453e Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Tue, 9 Oct 2018 18:03:59 +0100 Subject: [PATCH] Fixed bug in combining data range and soft_range (#3065) --- holoviews/core/util.py | 4 +++- holoviews/plotting/bokeh/chart.py | 4 ++-- holoviews/plotting/mpl/chart.py | 4 ++-- holoviews/tests/plotting/bokeh/testoverlayplot.py | 14 +++++++++++++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/holoviews/core/util.py b/holoviews/core/util.py index 0da171c386..8a5098556a 100644 --- a/holoviews/core/util.py +++ b/holoviews/core/util.py @@ -852,6 +852,7 @@ def range_pad(lower, upper, padding=None, log=False): start, end = lower-lpad, upper+upad else: start, end = lower, upper + return start, end @@ -861,7 +862,8 @@ def dimension_range(lower, upper, hard_range, soft_range, padding=None, log=Fals with the Dimension soft_range and range. """ lower, upper = range_pad(lower, upper, padding, log) - lower, upper = max_range([(lower, upper), soft_range]) + lower = max_range([(lower, None), (soft_range[0], None)])[0] + upper = max_range([(None, upper), (None, soft_range[1])])[1] dmin, dmax = hard_range lower = lower if dmin is None or not isfinite(dmin) else dmin upper = upper if dmax is None or not isfinite(dmax) else dmax diff --git a/holoviews/plotting/bokeh/chart.py b/holoviews/plotting/bokeh/chart.py index d47150dd71..a92b9cc28f 100644 --- a/holoviews/plotting/bokeh/chart.py +++ b/holoviews/plotting/bokeh/chart.py @@ -345,7 +345,7 @@ def get_extents(self, element, ranges, range_type='combined'): ydim = element.get_dimension(1) s0, s1 = ranges[ydim.name]['soft'] s0 = min(s0, 0) if isfinite(s0) else 0 - s0 = max(s1, 0) if isfinite(s1) else 0 + s1 = max(s1, 0) if isfinite(s1) else 0 ranges[ydim.name]['soft'] = (s0, s1) return super(HistogramPlot, self).get_extents(element, ranges, range_type) @@ -592,7 +592,7 @@ def get_extents(self, element, ranges, range_type='combined'): ydim = element.get_dimension(1) s0, s1 = ranges[ydim.name]['soft'] s0 = min(s0, 0) if isfinite(s0) else 0 - s0 = max(s1, 0) if isfinite(s1) else 0 + s1 = max(s1, 0) if isfinite(s1) else 0 ranges[ydim.name]['soft'] = (s0, s1) l, b, r, t = super(SpikesPlot, self).get_extents(element, ranges, range_type) if len(element.dimensions()) == 1 and range_type != 'hard': diff --git a/holoviews/plotting/mpl/chart.py b/holoviews/plotting/mpl/chart.py index 18689fee01..bd82f89d76 100644 --- a/holoviews/plotting/mpl/chart.py +++ b/holoviews/plotting/mpl/chart.py @@ -366,7 +366,7 @@ def get_extents(self, element, ranges, range_type='combined'): ydim = element.get_dimension(1) s0, s1 = ranges[ydim.name]['soft'] s0 = min(s0, 0) if isfinite(s0) else 0 - s0 = max(s1, 0) if isfinite(s1) else 0 + s1 = max(s1, 0) if isfinite(s1) else 0 ranges[ydim.name]['soft'] = (s0, s1) return super(HistogramPlot, self).get_extents(element, ranges, range_type) @@ -973,7 +973,7 @@ def get_extents(self, element, ranges, range_type='combined'): ydim = element.get_dimension(1) s0, s1 = ranges[ydim.name]['soft'] s0 = min(s0, 0) if isfinite(s0) else 0 - s0 = max(s1, 0) if isfinite(s1) else 0 + s1 = max(s1, 0) if isfinite(s1) else 0 ranges[ydim.name]['soft'] = (s0, s1) l, b, r, t = super(SpikesPlot, self).get_extents(element, ranges, range_type) if len(element.dimensions()) == 1 and range_type != 'hard': diff --git a/holoviews/tests/plotting/bokeh/testoverlayplot.py b/holoviews/tests/plotting/bokeh/testoverlayplot.py index 27ab746eac..58a1760934 100644 --- a/holoviews/tests/plotting/bokeh/testoverlayplot.py +++ b/holoviews/tests/plotting/bokeh/testoverlayplot.py @@ -2,7 +2,7 @@ from holoviews.core import NdOverlay, HoloMap, DynamicMap from holoviews.core.options import Cycle -from holoviews.element import Curve, Points, ErrorBars, Text +from holoviews.element import Curve, Points, ErrorBars, Text, VLine from .testplot import TestBokehPlot, bokeh_renderer @@ -169,3 +169,15 @@ def cb(X): self.assertEqual(len(plot.subplots), 3) for i, subplot in enumerate(plot.subplots.values()): self.assertEqual(subplot.cyclic_index, i) + + def test_complex_range_example(self): + errors = [(0.1*i, np.sin(0.1*i), (i+1)/3., (i+1)/5.) for i in np.linspace(0, 100, 11)] + errors = ErrorBars(errors, vdims=['y', 'yerrneg', 'yerrpos']).redim.range(y=(0, None)) + overlay = Curve(errors) * errors * VLine(4) + plot = bokeh_renderer.get_plot(overlay) + x_range = plot.handles['x_range'] + y_range = plot.handles['y_range'] + self.assertEqual(x_range.start, 0) + self.assertEqual(x_range.end, 10.0) + self.assertEqual(y_range.start, 0) + self.assertEqual(y_range.end, 19.655978889110628)