From 3700ae2ef535a23e93d5aa2a2205f50d0f707a32 Mon Sep 17 00:00:00 2001 From: Andrew <15331990+ahuang11@users.noreply.github.com> Date: Tue, 19 Sep 2023 08:31:06 -0700 Subject: [PATCH] Support plots that use `by` with `rasterize` with hv.ImageStack (#1132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP overlaying rasterized * Clean up * Add rasterize to check for categorical * Add test * Add version check * Update hvplot/converter.py Co-authored-by: Simon Høxbro Hansen --------- Co-authored-by: Simon Høxbro Hansen --- hvplot/converter.py | 7 +++++-- hvplot/tests/testoperations.py | 8 +++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/hvplot/converter.py b/hvplot/converter.py index 6eb4a7249..f17e81f56 100644 --- a/hvplot/converter.py +++ b/hvplot/converter.py @@ -582,7 +582,7 @@ def __init__( symmetric = self._process_symmetric(symmetric, clim, check_symmetric_max) if self._style_opts.get('cmap') is None: # Default to categorical camp if we detect categorical shading - if (self.datashade and (self.aggregator is None or 'count_cat' in str(self.aggregator)) and + if ((self.datashade or self.rasterize) and (self.aggregator is None or 'count_cat' in str(self.aggregator)) and ((self.by and not self.subplots) or (isinstance(self.y, list) or (self.y is None and len(set(self.variables) - set(self.indexes)) > 1)))): self._style_opts['cmap'] = self._default_cmaps['categorical'] @@ -1330,7 +1330,10 @@ def method_wrapper(ds, x, y): opts['rescale_discrete_levels'] = self._plot_opts['rescale_discrete_levels'] else: operation = rasterize - eltype = 'Image' + if Version(hv.__version__) < Version('1.18.0a1'): + eltype = 'Image' + else: + eltype = 'ImageStack' if self.by else 'Image' if 'cmap' in self._style_opts: style['cmap'] = self._style_opts['cmap'] if self._dim_ranges.get('c', (None, None)) != (None, None): diff --git a/hvplot/tests/testoperations.py b/hvplot/tests/testoperations.py index c2abd4cde..f3f303e04 100644 --- a/hvplot/tests/testoperations.py +++ b/hvplot/tests/testoperations.py @@ -3,12 +3,13 @@ from unittest import SkipTest from parameterized import parameterized +import colorcet as cc import hvplot.pandas # noqa import numpy as np import pandas as pd from holoviews import Store -from holoviews.element import Image, QuadMesh +from holoviews.element import Image, QuadMesh, ImageStack from holoviews.element.comparison import ComparisonTestCase from hvplot.converter import HoloViewsConverter @@ -194,6 +195,11 @@ def test_datashade_rescale_discrete_levels_default_True(self): actual = plot.callback.inputs[0].callback.operation.p['rescale_discrete_levels'] assert actual is expected + def test_rasterize_by(self): + expected = 'category' + plot = self.df.hvplot(x='x', y='y', by=expected, rasterize=True, dynamic=False) + assert isinstance(plot, ImageStack) + assert plot.opts["cmap"] == cc.palette['glasbey_category10'] class TestChart2D(ComparisonTestCase):