Skip to content

Commit 03cbf86

Browse files
authored
Merge pull request #4803 from janezd/palettes_with_more_than_256_colors
[FIX] Fix colors for discrete variables with >256 values
2 parents 42fc2cd + 2a26d05 commit 03cbf86

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

Orange/widgets/utils/colorpalettes.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,15 @@ def __init__(self, number_of_colors, nan_color=NAN_COLOR,
176176
"use 'force_glasbey' instead", DeprecationWarning)
177177
if force_glasbey or force_hsv \
178178
or number_of_colors > len(DefaultRGBColors):
179-
palette = Glasbey
179+
colors = Glasbey.palette[:number_of_colors]
180+
if number_of_colors > len(colors):
181+
colors = np.vstack(
182+
(colors, ) * (number_of_colors // len(colors))
183+
+ (colors[:number_of_colors % len(colors)], ))
180184
else:
181-
palette = DefaultRGBColors
185+
colors = DefaultRGBColors.palette[:number_of_colors]
182186
super().__init__("custom", "custom",
183-
palette.palette[:number_of_colors], nan_color,
187+
colors, nan_color,
184188
category=category, flags=flags)
185189

186190

Orange/widgets/utils/tests/test_colorpalettes.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,27 @@ def test_small_palettes():
159159
palette = LimitedDiscretePalette(100)
160160
np.testing.assert_equal(palette.palette, Glasbey.palette[:100])
161161

162+
def test_large_palettes(self):
163+
palette = LimitedDiscretePalette(257)
164+
qcolors = palette.qcolors
165+
qcolors_w_nan = palette.qcolors_w_nan
166+
c256 = qcolors[256].getRgb()
167+
168+
self.assertEqual(len(palette), 257)
169+
self.assertEqual(len(palette.palette), 257)
170+
self.assertEqual(len(qcolors), 257)
171+
self.assertEqual(len(qcolors_w_nan), 258)
172+
self.assertEqual([c.getRgb() for c in qcolors],
173+
[c.getRgb() for c in qcolors_w_nan[:-1]])
174+
self.assertEqual(palette[256].getRgb(), c256)
175+
np.testing.assert_equal(palette.value_to_color(256), c256[:3])
176+
self.assertEqual(palette.value_to_qcolor(256).getRgb(), c256)
177+
np.testing.assert_equal(palette.values_to_colors([256])[0], c256[:3])
178+
self.assertEqual(palette.values_to_qcolors([256])[0].getRgb(), c256)
179+
180+
for size in range(1020, 1030):
181+
self.assertEqual(len(LimitedDiscretePalette(size)), size)
182+
162183
@staticmethod
163184
def test_forced_glasbey_palettes():
164185
palette = LimitedDiscretePalette(5, force_glasbey=True)
@@ -598,6 +619,10 @@ def test_colors(self):
598619
np.testing.assert_almost_equal(var.colors,
599620
[palette[1], [13, 14, 15], palette[0]])
600621

622+
# Variable with many values
623+
var = DiscreteVariable("x", values=tuple(f"v{i}" for i in range(1020)))
624+
self.assertEqual(len(var.colors), 1020)
625+
601626
def test_colors_fallback_to_palette(self):
602627
var = DiscreteVariable.make("a", values=("F", "M"))
603628
var.palette = Dark2Colors

0 commit comments

Comments
 (0)