-
Notifications
You must be signed in to change notification settings - Fork 0
/
customcolormap.m
146 lines (139 loc) · 6.72 KB
/
customcolormap.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
% ----------------------------------------------------------------------- %
% FUNCTION "customcolormap" defines a customized colobar given the %
% positions and the colors that are going to generate the gradients. %
% %
% Input parameters: %
% - positions: Vector of positions, from 0 to 1. Note that the %
% first position must be 0, and the last one must %
% be 1. %
% - colors: Colors to place in each position. This parameter %
% can be specified as a RGB matrix (n_colors x 3), or
% as a cell vector, containing HTML values. %
% For instance: {'#ffffff','#ff0000','#000000'} is %
% equivalent to [1 1 1; 1 0 0; 0 0 0]. %
% - m: (Optional) Number of points (recommended: m > 64).%
% %
% Output variables: %
% - J: Colormap in RGB values (dimensions [mx3]). %
% ----------------------------------------------------------------------- %
% Example of use: %
% J = customcolormap([0 0.5 1], {'#ffffff','#ff0000','#000000'}); %
% colorbar; colormap(J); %
% ----------------------------------------------------------------------- %
% Versions: %
% - v1.0.: (19/11/2018) Original script. %
% ----------------------------------------------------------------------- %
% - Author: Víctor Martínez-Cagigal %
% - Date: 19/11/2018 %
% - Version: 1.0 %
% - E-mail: vicmarcag (at) gmail (dot) com %
% %
% Biomedical Engineering Group (University of Valladolid), Spain %
% ----------------------------------------------------------------------- %
function J = customcolormap(positions, colors, m)
% Error detection and defaults
if nargin < 3
f = get(groot,'CurrentFigure');
if isempty(f)
m = size(get(groot,'DefaultFigureColormap'),1);
else
m = size(f.Colormap,1);
end
end
if ~isnumeric(m), error('Parameter m must be numeric.'); end
if nargin < 2, error('Not enough parameters.'); end
if iscell(colors)
colors = colors(:);
n_colors = length(colors);
for i = 1:n_colors
temp = colors{i};
if ~ischar(temp)
error(['Colors must be specified in HEX format (e.g., #FFFFFF).' ...
' Type "help colorbar" for further information']);
elseif ~strcmp(temp(1),'#')
error(['Character # is missing if %s.' ...
' Type "help colorbar" for further information'], temp);
elseif length(temp)~=7
error(['Not a valid color format: %s (use this format: #FFFFFF).' ...
' Type "help colorbar" for further information'], temp);
end
end
elseif ismatrix(colors)
n_colors = size(colors);
if length(n_colors) ~= 2
error(['RGB colors must be a 2D matrix.' ...
' Type "help colorbar" for further information']);
elseif n_colors(2) ~= 3
error(['RGB colors matrix must have 3 columns.' ...
' Type "help colorbar" for further information']);
elseif min(colors(:))<0 || max(colors(:))>255
error(['RGB colors matrix values must range from 0 to 255.' ...
' Type "help colorbar" for further information']);
end
else
error(['Colors must be a cell vector or a matrix of RGB values.' ...
' Type "help colorbar" for further information']);
end
if ~isvector(positions)
error(['Positions must be specified as a vector.' ...
' Type "help colorbar" for further information']);
elseif min(positions)<0 || max(positions)>1
error(['Positions must range from 0 to 1 in an ascending order.' ...
' Type "help colorbar" for further information']);
elseif length(positions) ~= length(unique(positions))
error(['Check the positions vector, there are some duplicates.' ...
' Type "help colorbar" for further information']);
else
positions = sort(positions, 'ascend');
if positions(1)~=0
error(['The first positions must be 0.' ...
' Type "help colorbar" for further information']);
elseif positions(length(positions))~=1
error(['The last positions must be 1.' ...
' Type "help colorbar" for further information']);
elseif length(positions) ~= n_colors
error(['The number of positions does not match the number of colors.' ...
' Type "help colorbar" for further information']);
end
end
% Convert HEX colors into RGB colors if required
if iscell(colors)
hex_colors = colors;
colors = NaN(n_colors,3);
for i = 1:n_colors
colors(i,:) = hex2rgb(hex_colors{i});
end
end
% Compute positions along the samples
color_samples = round((m-1)*positions)+1;
% Make the gradients among colors
J = zeros(m,3);
J(color_samples,:) = colors;
diff_samples = diff(color_samples)-1;
for d = 1:1:length(diff_samples)
if diff_samples(d)~=0
color1 = colors(d,:);
color2 = colors(d+1,:);
G = zeros(diff_samples(d),3);
for idx_rgb = 1:3
g = linspace(color1(idx_rgb), color2(idx_rgb), diff_samples(d)+2);
g([1, length(g)]) = [];
G(:,idx_rgb) = g';
end
J(color_samples(d)+1:color_samples(d+1)-1,:) = G;
end
end
J = flipud(J);
end
% Function that converts an HEX string (format: #FFFFFF) to the
% corresponding RGB color
function rgb = hex2rgb(hexString)
if size(hexString,2) ~= 7
error('Not a color! %s', hexString);
else
r = double(hex2dec(hexString(2:3)))/255;
g = double(hex2dec(hexString(4:5)))/255;
b = double(hex2dec(hexString(6:7)))/255;
rgb = [r, g, b];
end
end