diff --git a/holoviews/core/data/grid.py b/holoviews/core/data/grid.py index 482414d395..f486bc0372 100644 --- a/holoviews/core/data/grid.py +++ b/holoviews/core/data/grid.py @@ -167,7 +167,6 @@ def coords(cls, dataset, dim, ordered=False, expanded=False, edges=False): ND-array matching the dimensionality of the dataset. """ dim = dataset.get_dimension(dim, strict=True) - idx = dataset.get_dimension_index(dim) irregular = cls.irregular(dataset, dim) if irregular or expanded: if irregular: @@ -179,6 +178,7 @@ def coords(cls, dataset, dim, ordered=False, expanded=False, edges=False): data = cls._infer_interval_breaks(data, axis=0) return data + idx = dataset.get_dimension_index(dim) data = dataset.data[dim.name] if ordered and np.all(data[1:] < data[:-1]): data = data[::-1] diff --git a/holoviews/core/data/xarray.py b/holoviews/core/data/xarray.py index ca1a4adb40..bdbee018fc 100644 --- a/holoviews/core/data/xarray.py +++ b/holoviews/core/data/xarray.py @@ -182,9 +182,18 @@ def coords(cls, dataset, dimension, ordered=False, expanded=False, edges=False): data = cls._infer_interval_breaks(data, axis=1) data = cls._infer_interval_breaks(data, axis=0) return data + + idx = dataset.get_dimension_index(dim) data = np.atleast_1d(dataset.data[dim].data) if ordered and data.shape and np.all(data[1:] < data[:-1]): data = data[::-1] + shape = cls.shape(dataset, True) + isedges = (dim in dataset.kdims and len(shape) == dataset.ndims + and len(data) == (shape[dataset.ndims-idx-1]+1)) + if edges and not isedges: + data = cls._infer_interval_breaks(data) + elif not edges and isedges: + data = np.convolve(data, [0.5, 0.5], 'valid') return data diff --git a/holoviews/plotting/bokeh/raster.py b/holoviews/plotting/bokeh/raster.py index d142aac1b6..177b55c55d 100644 --- a/holoviews/plotting/bokeh/raster.py +++ b/holoviews/plotting/bokeh/raster.py @@ -197,8 +197,9 @@ def get_data(self, element, ranges, style): else: xvals = element.dimension_values(x, expanded=True, flat=False) yvals = element.dimension_values(y, expanded=True, flat=False) - widths = np.diff(element.interface.coords(element, x, edges=True)) - heights = np.diff(element.interface.coords(element, y, edges=True)) + xc, yc = (element.interface.coords(element, x, edges=True), + element.interface.coords(element, y, edges=True)) + widths, heights = np.diff(xc), np.diff(yc) xs, ys = xvals.flatten(), yvals.flatten() ws, hs = cartesian_product([widths, heights], copy=True) zvals = zdata.flatten() if self.invert_axes else zdata.T.flatten() diff --git a/holoviews/plotting/mpl/raster.py b/holoviews/plotting/mpl/raster.py index 8dfb1f2007..e4d5bc4e5c 100644 --- a/holoviews/plotting/mpl/raster.py +++ b/holoviews/plotting/mpl/raster.py @@ -235,7 +235,8 @@ def get_data(self, element, ranges, style): data = np.ma.array(zdata, mask=np.logical_not(np.isfinite(zdata))) expanded = element.interface.irregular(element, element.kdims[0]) edges = style.get('shading') != 'gouraud' - coords = [element.interface.coords(element, d, expanded=expanded, edges=edges) + coords = [element.interface.coords(element, d, ordered=True, + expanded=expanded, edges=edges) for d in element.kdims] if self.invert_axes: coords = coords[::-1] @@ -260,7 +261,7 @@ def update_handles(self, key, axis, element, ranges, style): locs = style.get('locs') old_locs = self.handles.get('locs') if None in (locs, old_locs) or (locs == old_locs).all(): - cmesh.set_array(data[-1]) + cmesh.set_array(data[-1].flatten()) cmesh.set_clim((style['vmin'], style['vmax'])) if 'norm' in style: cmesh.norm = style['norm'] diff --git a/tests/testelementindexing.py b/tests/testelementindexing.py index 3e138de10a..2dfcc34b12 100644 --- a/tests/testelementindexing.py +++ b/tests/testelementindexing.py @@ -15,70 +15,52 @@ def setUp(self): def test_slice_all(self): sliced = self.hist[:] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, self.values) - self.assertEqual(edges, self.edges) + self.assertEqual(sliced.values, self.values) + self.assertEqual(sliced.edges, self.edges) def test_slice_exclusive_upper(self): "Exclusive upper boundary semantics for bin centers" sliced = self.hist[:6.5] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, np.arange(6)) - self.assertEqual(edges, np.arange(7)) + self.assertEqual(sliced.values, np.arange(6)) + self.assertEqual(sliced.edges, np.arange(7)) def test_slice_exclusive_upper_exceeded(self): "Slightly above the boundary in the previous test" sliced = self.hist[:6.55] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, np.arange(7)) - self.assertEqual(edges, np.arange(8)) + self.assertEqual(sliced.values, np.arange(7)) + self.assertEqual(sliced.edges, np.arange(8)) def test_slice_inclusive_lower(self): "Inclusive lower boundary semantics for bin centers" sliced = self.hist[3.5:] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, np.arange(3, 10)) - self.assertEqual(edges, np.arange(3, 11)) + self.assertEqual(sliced.values, np.arange(3, 10)) + self.assertEqual(sliced.edges, np.arange(3, 11)) def test_slice_inclusive_lower_undershot(self): "Inclusive lower boundary semantics for bin centers" sliced = self.hist[3.45:] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, np.arange(3, 10)) - self.assertEqual(edges, np.arange(3, 11)) + self.assertEqual(sliced.values, np.arange(3, 10)) + self.assertEqual(sliced.edges, np.arange(3, 11)) def test_slice_bounded(self): sliced = self.hist[3.5:6.5] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, np.arange(3, 6)) - self.assertEqual(edges, np.arange(3, 7)) + self.assertEqual(sliced.values, np.arange(3, 6)) + self.assertEqual(sliced.edges, np.arange(3, 7)) def test_slice_lower_out_of_bounds(self): sliced = self.hist[-3:] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, self.values) - self.assertEqual(edges, self.edges) + self.assertEqual(sliced.values, self.values) + self.assertEqual(sliced.edges, self.edges) def test_slice_upper_out_of_bounds(self): sliced = self.hist[:12] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, self.values) - self.assertEqual(edges, self.edges) + self.assertEqual(sliced.values, self.values) + self.assertEqual(sliced.edges, self.edges) def test_slice_both_out_of_bounds(self): sliced = self.hist[-3:13] - values = sliced.dimension_values(1) - edges = sliced.interface.coords(sliced, sliced.kdims[0], edges=True) - self.assertEqual(values, self.values) - self.assertEqual(edges, self.edges) + self.assertEqual(sliced.values, self.values) + self.assertEqual(sliced.edges, self.edges) def test_scalar_index(self): self.assertEqual(self.hist[4.5], 4)