How to create a cyclic color palette

 Accepted Answer

Hi,
You can use the "hsv" function to create a cyclic rainbow color palette, as the HSV color space is naturally cyclic with respect to hue.
% Number of colors you want in the palette
numColors = 256;
% Generate a cyclic rainbow color palette
rainbowPalette = hsv(numColors);
% Example: Use the palette for a plot
x = linspace(0, 2*pi, 1000);
y = sin(x);
scatter(x, y, 10, mod(1:1000, numColors)+1, 'filled');
colormap(rainbowPalette);
colorbar;
In this example, "hsv(numColors)" generates a "numColors x 3" matrix, where each row is an RGB color corresponding to a color in the HSV color wheel. The colors range from red, through all the hues of the rainbow, back to red, creating a cycle.
You can read more about the "hsv" function here: https://www.mathworks.com/help/matlab/ref/hsv.html
Hope this helps!

4 Comments

Guy Nir
Guy Nir on 4 Apr 2024
Edited: Guy Nir on 4 Apr 2024
Yes, I was thinking of hsv too but is it ‘really’ rainbow? Because it seems to be more red in one end and ‘brownish’ at the other end. But that could be me…
It depends on the number of elements in the colormap. The way hsv is interpolated, the last color should wrap to the first color with the same interval as any other two adjacent colors in the colormap. If there are few colors in the hsv colormap, the wrapping may not be obvious.
tiledlayout('horizontal','TileSpacing','tight')
for i = [3:15,20:5:40]
ax = nexttile();
colormap(ax,hsv(i))
cb = colorbar();
axis off
cb.Title.String = string(i);
cb.Ticks = [];
end
I see. I think that ideally the function will take a map similiar to the one with 40 colors and rescale it with let's say, 20 colors, thus keeping the obvious cyclic nature of the map.
If you want to always ensure that the ends are the same color regardless of the length of the map, you can just append that tuple.
ncolors = 9;
CT = hsv(ncolors);
CT = CT([1:end 1],:);
image(permute(CT,[1 3 2]))
set(gca,'ydir','normal')
... of course this makes anything you do with the map ambiguous, since the same color maps to two distinct values.
Despite casual appearances, it's also no longer cyclic, since it has a duplicate red element.
image(permute([CT;CT],[1 3 2]))
set(gca,'ydir','normal')
This is something that might be more justifiable with a really long colormap, but for a short discrete color table, I don't think it makes sense.

Sign in to comment.

More Answers (0)

Categories

Products

Release

R2023b

Asked:

on 4 Apr 2024

Commented:

DGM
on 4 Apr 2024

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!