Skip to content

Commit

Permalink
Cleanup and add test
Browse files Browse the repository at this point in the history
  • Loading branch information
ahuang11 committed Mar 15, 2024
1 parent 3934224 commit 6c91f6d
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 4 deletions.
17 changes: 13 additions & 4 deletions holoviews/plotting/bokeh/raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,25 +259,34 @@ def _get_cmapper_opts(self, low, high, factors, colors):
def _get_colormapper(self, eldim, element, ranges, style, factors=None,
colors=None, group=None, name='color_mapper'):
indices = None
vdims = element.vdims
if isinstance(style.get("cmap"), dict):
keys, values = zip(*style["cmap"].items())
missing = [vd.name for vd in element.vdims if vd.name not in keys]
dict_cmap = style["cmap"]
missing = [vd.name for vd in vdims if vd.name not in dict_cmap]
extra = [k for k in dict_cmap if k not in vdims]
if missing:
missing_str = "', '".join(sorted(missing))
raise ValueError(
"The supplied cmap dictionary must have the same "
f"value dimensions as the element. Missing: '{missing_str}'"
)
elif extra:
extra_str = "', '".join(sorted(extra))
self.param.warning(
f"The supplied cmap dictionary has extra value dimensions: "
f"'{extra_str}'. Ignoring these value dimensions."
)
keys, values = zip(*dict_cmap.items())
style["cmap"] = list(values)
indices = [keys.index(vd.name) for vd in element.vdims]
indices = [keys.index(vd.name) for vd in vdims]

cmapper = super()._get_colormapper(
eldim, element, ranges, style, factors=factors,
colors=colors, group=group, name=name
)

if indices is None:
num_elements = len(element.vdims)
num_elements = len(vdims)
step_size = len(cmapper.palette) // num_elements
indices = np.arange(num_elements) * step_size

Expand Down
31 changes: 31 additions & 0 deletions holoviews/tests/plotting/bokeh/test_rasterplot.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from holoviews.plotting.bokeh.raster import ImageStackPlot
from holoviews.plotting.bokeh.util import bokeh34

from ..utils import ParamLogStream
from .test_plot import TestBokehPlot, bokeh_renderer


Expand Down Expand Up @@ -424,6 +425,36 @@ def test_image_stack_dict_cmap(self):
np.testing.assert_equal(source.data["image"][0][:, :, 2], c)
assert plot.handles["color_mapper"].palette == ["green", "red", "yellow"]

def test_image_stack_dict_cmap_missing(self):
x = np.arange(0, 3)
y = np.arange(5, 8)
a = np.array([[np.nan, np.nan, 1], [np.nan] * 3, [np.nan] * 3])
b = np.array([[np.nan] * 3, [1, 1, np.nan], [np.nan] * 3])
c = np.array([[np.nan] * 3, [np.nan] * 3, [1, 1, 1]])

img_stack = ImageStack((x, y, a, b, c), kdims=["x", "y"], vdims=["b", "a", "c"])
with pytest.raises(ValueError, match="must have the same value dimensions"):
img_stack.opts(cmap={"c": "yellow", "a": "red"})

def test_image_stack_dict_cmap_extra(self):
x = np.arange(0, 3)
y = np.arange(5, 8)
a = np.array([[np.nan, np.nan, 1], [np.nan] * 3, [np.nan] * 3])
b = np.array([[np.nan] * 3, [1, 1, np.nan], [np.nan] * 3])
c = np.array([[np.nan] * 3, [np.nan] * 3, [1, 1, 1]])

img_stack = ImageStack((x, y, a, b, c), kdims=["x", "y"], vdims=["a", "b", "c"])
with ParamLogStream() as log:
img_stack.opts(cmap={"c": "yellow", "a": "red", "b": "green", "d": "blue"})
plot = bokeh_renderer.get_plot(img_stack)
source = plot.handles["source"]
np.testing.assert_equal(source.data["image"][0][:, :, 0], a)
np.testing.assert_equal(source.data["image"][0][:, :, 1], b)
np.testing.assert_equal(source.data["image"][0][:, :, 2], c)
assert plot.handles["color_mapper"].palette == ["red", "green", "yellow"]
log_msg = log.stream.read()
assert "extra value dimensions: 'd'" in log_msg


class TestImageStackEven(_ImageStackBase):
__test__ = True
Expand Down

0 comments on commit 6c91f6d

Please sign in to comment.