写在前面的话
作为一个理科男,也许我的科研能力达不到理工男的平均水准。但你要是说比审美,那我想说在座的各位都是弟弟。每当导师让我画图时,红黄绿三原色都是我的第一选择。于是我画的图往往就成了如下样式:
果然没有一点点做作,好看,显眼,清晰,自然……
正文
不自黑了,回到正题。在科研的过程中,我想很多人应该和我一样或多或少会遇到画图的配色问题。我脑子里想的颜色是这样的,可一旦用代码实现,就立刻被自己的审美深深的震撼。本文,为了解决这个问题,给出了两种方法。
RColorBrewer配置所需颜色
RColorBrewer提供了3套配色方案:
- 连续性(Sequential),颜色渐变,由浅到深。通常在画图时,我们会使用浅色表示较低的值,深色表示较高的值
- 离散型(Qualitative),生成差异显著的颜色(如前文所说的红黄蓝,但要好看很多),通常用来标注分类数据。
- 发散性(Diverging),两端深,中间浅色,强调从一个深色到另一个神色的渐变(画热图时经常会使用)。还可以用这种色调画图以标注图中的离群点。
下面给出三种不同类型配色的调色盘样式,可以使用命令 display.brewer.all()
调用 :
RColorBrewer除了给出了合适的配色方案,还有一个优点,那就是会告诉你这种配色方案是否对色盲友好。输入 brewer.pal.info
,会给出下面的信息:
- 第一列给出的是颜色名称,比如第一个就是
BrBG
- 第二列给出的是该颜色方案的最大数量,如
BrBG
类型最多支持11种颜色 - 第三列给出的就是前面所讲的三类配色方案的简称。
- 第四列
colorblind
表示的是否对色盲友好
我们可以使用 display.brewer.pal
命令查看各种配色类型的具体情况,如display.brewer.pal(11,'BrBG')
会出现下面所示的图案:
有时候我们不想使用全部颜色,只想要使用某个配色方案中的三四种颜色怎么办呢?使用命令 brewer.pal
即可,如我们输入brewer.pal(11,'BrBG')
,结果如下:
我们可以看到 RColorBrewer
包中的所有颜色都是以十六进制颜色格式存储的,每一个颜色都对应有一个十六进制表示。
此外, RColorBrewer
包中某一种配色的种类是有限制的,比如 seq
类型配色都只有9个颜色。不过,好在我们可以使用 colorRampPalette
函数创建颜色梯度。比如:
mycolor <- brewer.pal(9,'YlOrRd') # 生成某个颜色类型的9种颜色
pal <- colorRampPalette(mycolor) # 生成颜色梯度
mycolors <- pal(24) # 设置生成24个梯度
# 上面两行代码等价于 mycolors <- colorRampPalette(mycolor)(24)
barplot(1:24,col = mycolors)
生成的结果如下:
总结
-
display.brewer.all()
调用所有的配色方案(图示) -
brewer.pal.info
展示所有的配色方案(文字) -
display.brewer.pal(num,clor_name)
如:display.brewer.pal(11,'BrBG')
- 使用
colorRampPalette
函数创建颜色梯度
rPlotter配色——所见即所得
第一次知道这个包,来自于Y叔那篇“食色性也”的文章。虽然上述的 RColorBrewer
包给了我们很多优秀的配色,但是很多时候我们偶然看到了一个图片、一个海报、一帧电影画面,想要利用其中的配色该怎么办呢?你可能会觉得这怎么可能?但是 rPlotter
包让不可能成为可能。
它是怎么实现的呢?主要是利用 EBImage
包将图片读入,并存储为一个RGB的三维矩阵。然后利用k-means
聚类,把中心点颜色报出来即可。下面简单的介绍一下使用方法,并给出几个例子:
先随机找个图,比如电影《你的名字》海报:
[图片上传失败...(image-5a79c5-1586482322683)]
# 加载包
library('rPlotter')
# 将图片链接存入,转换为三局矩阵,并设置所需颜色的
pal = extract_colours("http://img5.mtime.cn/CMS/News/2017/09/28/095202.11304096_620X620.jpg")
barplot(1:5, col=pal)
结果如下,明显比我之前的红黄蓝好多了…… 以后在办公室看动画,再也不怕被训了,可以大声的告诉导师,我在为figure选配色!!!
声明一下,如果因此被老板训,我不负责~
安装
rPlotter
包的安装有点麻烦,下面是官方推荐的安装流程。我试了试这个安装流程,虽然中间出现了几个问题,但是按照错误提示,最后还是可以成功安装的。
## CRAN Packages
install.packages(c("ggplot2", "stringr", "reshape2", "dichromat"))
## EBImage
source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")
## Packages on GitHub
library(devtools)
install_github("ramnathv/rblocks")
## And finally ...
install_github("woobe/rPlotter")