Skip to content

Commit 99861b2

Browse files
authored
fix(plotly): Dict as cmap for categorical data (#6940)
1 parent 7a2b1d9 commit 99861b2

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

holoviews/plotting/plotly/element.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,17 @@ def _apply_transforms(self, element, ranges, style):
440440
if not is_plotly_allowed_colors:
441441
val = cat_indices
442442

443+
cmap = style.get("cmap")
444+
if isinstance(cmap, dict):
445+
style = dict(style)
446+
style["cmap"] = [c for cat in categories if (c := cmap.get(cat))]
447+
if len(style["cmap"]) != len(categories):
448+
missing = ", ".join(
449+
map(repr, sorted(set(categories) - set(cmap.keys())))
450+
)
451+
msg = f"Missing color(s) for categories: {missing}"
452+
raise ValueError(msg)
453+
443454
copts = self.get_color_opts(v, element, ranges, style)
444455
copts.update({"cmin": 0, "cmax": len(categories) - 1, "cauto": False})
445456

holoviews/tests/plotting/plotly/test_scatterplot.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import numpy as np
4+
import pytest
45

56
import holoviews as hv
67
from holoviews.plotting.plotly.util import PLOTLY_MAP, PLOTLY_SCATTERMAP
@@ -62,6 +63,24 @@ def test_scatter_categorical_color(self):
6263
assert state["data"][0]["marker"]["cmin"] == 0
6364
assert state["data"][0]["marker"]["cmax"] == 2
6465

66+
def test_scatter_categorical_color_cmap_dict(self):
67+
scatter = hv.Scatter([(0, 1, "A"), (1, 2, "B")], vdims=["y", "category"])
68+
scatter.opts(color="category", cmap={"A": "black", "B": "red"})
69+
state = self._get_plot_state(scatter)
70+
71+
marker = state["data"][0]["marker"]
72+
np.testing.assert_array_equal(marker["color"], [0, 1])
73+
assert marker["colorscale"] == [[0, "black"], [1, "red"]]
74+
assert marker["cmin"] == 0
75+
assert marker["cmax"] == 1
76+
77+
def test_scatter_categorical_color_cmap_dict_missing(self):
78+
scatter = hv.Scatter([(0, 1, "A"), (1, 2, "B")], vdims=["y", "category"])
79+
scatter.opts(color="category", cmap={"A": "black"})
80+
msg = "Missing color\\(s\\) for categories: 'B'"
81+
with pytest.raises(ValueError, match=msg):
82+
self._get_plot_state(scatter)
83+
6584
def test_scatter_markers(self):
6685
scatter = hv.Scatter(
6786
[(0, 1, "square"), (1, 2, "circle"), (2, 3, "triangle-up")], vdims=["y", "marker"]

0 commit comments

Comments
 (0)