写在前面
Matlab 在绘图功能上十分的强大,但是它在绘图呈现的配色方案是固定的。当然我们可以指定曲线或者曲面的颜色来更改颜色方案,但如果对于图中曲线较多的情况下,这就显得过于麻烦。
另外,我们可能需要尝试不同的配色方案,从而作出比较美观合适的图。
为了解决以上问题,今天我就来介绍一个由Charles 编写的Matlab 函数 cbrewer. 把它添加到Matlab 库函数中,可以实现:
1. 在Matlab 中使用命令来查看不同的配色方案;
2. 生成某一种配色方案的RGB 表格,并应用于绘图;
3. 允许通过插值(interp1插值方法) RGB 索引来为每个色表使用可变数量的颜色。
接下来我们将依次呈现:
1. Matlab颜色表示方法与 cbrewer 简介;
2. cbrewer 的下载并将其添加到matlab 库函数中;
3. cbrewer 的基本使用方法。
一. Matlab颜色表示方法与 cbrewer 简介
在matlab 中,对于一些常见的颜色(红橙黄...),我们可以直接指定颜色的名称('red', 'orange')去修改曲线的颜色。而对于一些没有名称的颜色,我们就必须要用RGB 模式去指定。
RGB模式下的三种基本色,红色(R),绿色(G),蓝色(B) 按照不同的比例混合即可得到我们自然界中肉眼可见的所有颜色。在matlab 中,每一种基色的比例由一个0-1 之间的数字来指定,那么我们就可以指定一个三维行向量去表示某一种特定的颜色。如[0 0 1]代表蓝色,[1 1 1]代表白色。
那么对于一种配色方案(不同颜色按顺序排列),当然就可以用一组三维行向量去表示。比如对于下图的配色(8种颜色):
就可以用一个八行三列的矩阵表示:
而cbrewer 正是这样一种函数:它可以提供多种可以使用命令提前预览的配色方案,并将某一种配色方案在matlab 得到一组三维行向量,供我们直接使用。
cbrewer 还采用interp1 方法对 RGB值进行插值处理,从而能够得到任意数量的颜色的配色方案(RGB不同行数的三维矩阵)。
此外,cbrewer 产生的三维向量还可以直接应用生成colormap。
关于cbrewer 的一些具体介绍以及配色效果,大家可以访问:
ColorBrewer: Color Advice for Maps
cbrewer : colorbrewer schemes for Matlab - File Exchange - MATLAB Central
二. cbrewer 的下载并将其添加到库函数
由于cbrewer不是matlab自身默认携带的库函数,因此我们需要自行下载并将其加入到库函数中去。
cbrewer : colorbrewer schemes for Matlab - File Exchange - MATLAB Central
首先我们打开上面的下载链接,点击下图箭头所指的的 Download 进行下载得到压缩文件。
然后将其解压后的文件夹放入一个指定的路径中(要记住,图省事我就直接放在C盘目录下了)。打开matlab,点击“Set Path”(中文为路径设置,或者是设置路径吧)。
在打开的窗口中点击“Add with Subfolders...”,然后进入cbrewer文件夹的存放路径,选择cbrewer文件夹。
返回到上图窗口后,点击“save”(中文“保存"),确认后,退出窗口。
为了确认cbrewer 是否被正确地添加到路径,我们可以在matlab命令窗口中输入:
help cbrewer
如果返回关于 cbrewer 的帮助信息,那么表示此函数已经被成功地添加到库函数中。
三. cbrewer 的基本使用方法
成功将其添加到matlab 之后我们就可以具体地使用这个函数了。其实具体的使用方法在上面使用 help cbrewer 命令得到的帮助信息里都有,但这里还是用中文来介绍一下。
首先我们查看一下,这个函数里所包含的配色方案,在matlab 命令窗口中输入:
cbrewer()
回车可以得到如下图所示的一个配色方案图,图上面的三个单词分别表示配色图的三个类型
1. Diverging 发散类型,可以看到该类型配色,中间颜色最淡,向两边延伸出两个色系;
2. Sequential 连续类型,一般为同一个色系,越往右,颜色越深;
3. Qualitative 定性类型,此类型的方案中各个颜色差别很大。
上面三个类型,在函数使用中,一般缩写为 div, seq, qua.
同时,在下图中,每一个类型的配色方案左侧为每一个具体配色方案的名称。在具体使用cbrewer函数的过程中,我们也是通过先指定配色方案类型以及具体配色方案名称去得到某一个配色方案的RGB 值的矩阵。
获取某种配色方案的RGB值的矩阵可由以下命令获得:
RGB = cbrewer('配色方案类型', '具体配色方案', 颜色个数, '插值方法')
其中‘插值方法’是采用matlab 内置函数interp1的方法,一般用'linear' 就行。
颜色个数 在‘linear’插入方式下,可以随意更改,根据自己所需要绘制曲线的个数或者配色的密集程度要求来确定。
比如在matlab 命令窗口中输入以下命令:
RGB = cbrewer('seq', 'Greens', 10, 'linear')
我们发现返回了一个3列10行,名为RGB的矩阵。
那么矩阵RGB中每一行就代表了一个具体的颜色,我们可以运行以下代码简单的看下矩阵中每一行所代表的颜色。
RGB = cbrewer('seq', 'Greens', 10, 'linear');% 生成一个配色方案的RGB矩阵
x = linspace(-1,1,100);% 自变量x
for a = 1:10
plot(x, a.*x.^2, 'Color', RGB(a,:), 'LineWidth', 2);
hold on;
end
上述代码绘制了抛物线在分别取时,其在时的函数图像。结果如下图所示。
我们可以看到,随着 的不断增大,曲线的绿色程度不断加深。这种配色方案对于我们想要突出函数中某个参数变化时,因变量如何变化是有清晰直观的效果的。当然我们可以把图做的更漂亮一些,比如下图,误差函数 随参数 的变化趋势。这种连续型的配色方案可以定性的看出某个函数对于其中的参数变化的敏感程度。
比如说论文中常用的敏感性分析,便可以用此种配色方案来实现(如下图所示)。
此外,由cbrewer 生成的配色方案可以直接用于colormap,以绘制一个马鞍面 为例:
x1 = linspace(-1,1,20);
y1 = linspace(-1,1,20);
[X, Y] = meshgrid(x1, y1);
Z = X.^2 - Y.^2;
surf(X, Y, Z);
colorbar('FontSize',12);
按上述原始代码,通过matlab默认的配色方案,绘制的结果如下图所示:
如果我们在上述代码后,加入cbrewer生成的配色方案的代码:
RGB=cbrewer('seq', 'PuBu', 100, 'linear'); % 生成PuBu的配色方案的RGB矩阵
colormap(RGB); % 将RGB配色用于colormap
那么我们就可以更改三维绘图的配色,如下图所示。
当然具体配色方案的选择还是需要根据自身对绘图的要求来确定,可以尝试不同的配色方案,或者选择自己喜爱的色系。
最后总结一下:
# 在matlab绘图中,使用某种颜色可以采用RGB模式,其是一个三维的行向量,每个分量代表着三个基本色的深浅程度;
# 配色方案matlab中RGB模式下实际上就是一个多行的RGB值的矩阵;
# cbrewer函数本身自带一些配色方案,在matlab命令窗口下可以通过 cbrewer() 命令来查看;
# 通过 RGB = cbrewer('配色方案类型', '具体配色方案', 颜色个数, '插值方法') 命令,可以将某种配色方案转化为RGB值的矩阵,以供使用;
# 可以修改命令中 颜色个数 来控制生成的配色个数;
# cbrewer 生成的RGB值的矩阵可直接用于colormap。
当然,合适的配色的选择还是需要大家多多尝试。 如果大家在实际使用中有什么问题,也欢迎在评论区讨论。
注:本文原出自知乎账号@menkez,与此账号归属同一作者。