渐变配色在科研绘图时十分常用,比如三维柱状图、特征渲染散点图、热图、曲面图、等高线填充图等等,都需要使用渐变配色。
虽说现成的渐变配色有很多,比如,在TheColor配色工具的渐变颜色库中便集成了近千种的渐变色:
然而,在很多时候,仍然需要我们自己来制作渐变颜色图。
此外,一些渐变色仅由少量颜色组成,在一些场景应用时,会出现“波纹“现象,因此需要对其进行致密化处理;另一方面,如果我们就是想要七八种颜色组成的稀疏渐变色,那还需要对其进行稀疏化处理。
还有一个问题是,当我们想要编辑颜色图,调节颜色的显示区间时,会发现Matlab自带的colormapeditor有些难用,这个懂得都懂。
为了解决上述问题,我在今年6月份用Matlab制作了一个ColorMap渐变色生成/编辑器。
推出以来,虽说得到了大家的一致好评,但实际应用了一段时间后,发现还有一些地方可以进一步增强。
假如我们绘制了这样一幅带光影的曲面图:
想要让colorbar上0以上的部分为棕色,0以下的部分为蓝色,该怎么操作呢?
很简单,只需要用ColorMapPro的‘mode3’功能:
N = 256;
C = [146 080 051
196 151 105
248 220 195
255 255 255
143 214 239
094 179 226
048 106 180]/255;
[map2,CA] = ColorMapPro('color',C, ... % 待处理渐变色
'number',N, ... % 生成渐变颜色数
'center',0, ... % 二分化断点位置
'MaxCenterMinColorID',[1 4 7], ... % 最大、中心、最小值颜色在C中的行号
'mapdata',Z(:), ... % 待渲染特征
'mode3');
其中,‘center’表示二分化中心,在此例中为0;‘MaxCenterMinColorID’表示颜色条最大值、中心以及最小值所对应颜色矩阵C的行号,此例中最大值对应棕色,行号为1,中心对应白色,行号为4,最小值对应蓝色,行号为7;CA为颜色条范围参数。
然后:
% 赋色
colormap(map2)
colorbar
caxis(CA)
即可得到所需要的以0为中心的二分化对象:
具体示例程序见demo5
旧版本中,在生成渐变色前,需要我们自己定义由少量颜色组成的基础颜色矩阵C,有些影响作图效率。
新版本中,增加了图片取色功能,使用时,只需要在ColorMapPro中增加‘copy’参数:
%% ColorMapPro取色生成渐变色
N = 256;
% 等间距模式
map1 = ColorMapPro('copy','number',N,'mode1');
figure
image(permute(map1,[1,3,2]))
% 非等间距模式
ratio = [0.1 0.1 0.1 0.1 0.2 0.4];
map2 = ColorMapPro('copy','number',N,'ratio',ratio,'mode2');
然后打开图片,鼠标单击取点:
即可快速得到想要的颜色条,以用于作图:
具体示例程序见demo4
对于给定的颜色矩阵:
C = [ 2 48 71
18 104 131
39 158 188
144 201 230
255 255 255]/255;
利用ColorMap工具,将颜色矩阵C与渐变色数量N作为输入参数,即可得到渐变色颜色图map:
N = 256;
map = ColorMapPro('color',C,'number',N,'mode1');
然后利用colormap(map)命令对已有数据图赋色:
具体示例程序见demo1
对于已有的渐变色颜色图,比如addcolorplus配色强化工具中的300号渐变色:
C = addcolorplus(300);
% 绘图
figure
image(permute(C,[1,3,2]))
如果觉得颜色渐变程度还不够,可以通过ColorMap工具,设置一个较大的渐变色数量N1:
% 致密化后渐变色总数
N1 = 256;
% ColorMap颜色致密化处理
map = ColorMapPro('color',C,'number',N1,'mode1');
% 绘图
figure
image(permute(map,[1,3,2]))
而如果想要对其进行稀疏化处理,只需设置一个较小的渐变色数量N2:
% 稀疏化后渐变色总数
N2 = 7;
% ColorMap颜色稀疏化处理
map = ColorMapPro('color',C,'number',N2,'mode1');
% 绘图
figure
image(permute(map,[1,3,2]))
具体示例程序见demo2
上述两种功能均采用等间距模式生成渐变色。
而ColorMap工具中还包括另一种模式:非等间距模式。
对于给定的颜色矩阵C:
C = [068 004 090
065 062 133
048 104 141
031 146 139
053 183 119
145 213 066
248 230 032]/255;
首先定义比例参数ratio:
ratio = [0.1 0.1 0.1 0.1 0.2 0.4];
具体来说,对于给定数量的渐变色颜色图,ratio中的0.4表示(145 213 066)和(248 230 032)两种颜色渐变的占比为40%,0.2表示(053 183 119)和(145 213 066)两种颜色渐变的占比为20%……
特别注意,ratio变量中数字的数量等于颜色矩阵C的行数减1,数字之和等于1,而且所有数字不能完全相等(完全相等就是等间距模式)。
然后,利用ColorMap工具的‘mode2’生成非等间距渐变色:
map2 = ColorMapPro('color',C,'number',N,'ratio',ratio,'mode2');
最后使用colormap(map)命令对已有数据图赋色即可:
具体示例程序见demo3
以上。
Matlab渐变色生成/编辑器ColorMapPro