Why another rainbow
In the comment section of my last post Steve Eddins from Mathworks reported that some Matlab users prefer Jet to Parula, the new default perceptual colormap in Matlab, because within certain ranges Jet affords a greater contrast, intended as the rate of change in lightness.
My counter-argument to that is that yes, some data may benefit from being displayed using Jet (in terms of contrast, and hence the power to resolve smaller anomalies) because of those areas of very steep rate of change of lightness, like the blue to cyan and yellow to red portions (see Figure 1). But the price one has to pay is that there is an area of very low gradient (a greenish band between cyan and yellow) where there’s nearly no contrast, which would obfuscate subtle anomalies in the data. On top of that there’s no control of where each of those areas are located, so a lot of effort has to go into trying to fit those regions of artificially high contrast to the portion of data of interest.
Because of their high lightness, the yellow and cyan artificial edges also cause problems. In his latest blog post Steve uses a test pattern do demonstrate how they make the interpretation of trivial structures more difficult. He also explains why they occurr in some locations and not others in the first place. I wonder if the resulting regions of high lightness juxtaposed to regions of low lightness could be chromatic Mach bands.
Additionally, as Steve points out, the low-contrast juxtaposition of dark red and dark blue bands creates the visual illusion of depth (Chromostereopsis) in other positions of the test pattern, creating further confusion.
But I have some good news for the hardcore fans of Jet, and rainbow colormaps in general. I created a rainbow with a sawtooth-shaped lightness profile made up of 5 ramps, each with the same rate of change in lightness and total lightness change of 60, and alternatively negative and positive signs. This is shown in Figure 2, and replaces the lightness profile of a basic 6-color rainbow (magenta-blue-cyan-green-yellow-red) shown in Figure 3.
With this rainbow users have the ability to apply greater contrast to their data to boost small anomalies, but in a more controlled way. The colormap is available with my File Exchange function, Perceptually improved colormaps. Below is the Matlab code I used to generate the new rainbow.
To run this code you will need Colorspace, a free function from Matlab File Exchange, for the color space transformations.
%% basic 6-colour rainbow % create RGB components m = [1, 0, 1]; % magenta b = [0, 0, 1]; % blue c = [0, 1, 1]; % cyan g = [0, 1, 0]; % green y = [1, 1, 0]; % yellow r = [1, 0, 0]; % red % concatenate components rgb = vertcat(m,b,c,g,y,r); % interpolate to 256 colours rainbow=interp1(linspace(1, 256, 6),rgb,[1:1:256]);
%% calculate Lab components % convert from RGB to Lab colour space % requires this function: Colorspace transforamtions % www.mathworks.com/matlabcentral/fileexchange/28790-colorspace-transformations lab = colorspace('RGB->Lab',rainbow);
%% replace random lightness profile with sawtooth-shaped profile % contrast (magnitude of lightness change) between % each pair of adjeacent colors set to 60 L1 = [90, 30, 90, 30, 90, 30]; % interpolate to 256 lightness values L1int = interp1(linspace(1, 256, 6),L1,[1:1:256])'; % replace lab1 = horzcat(L1int,lab(:,2),lab(:,3));
%% new rainbow % convert back from Lab to RGB colour space swtth = colorspace('RGB<-Lab',lab1);
Figures 4, 5, and 6 show the three colormaps used with my Pyramid test surface (notice in Figure 5 that the green band artifact with this rainbow is even more pronounced than with jet). I welcome feedback.
The coloured lightness profiles were made using the Colormapline submission from the Matlab File Exchange.