R 色彩 详解与实例

目录

要点: R中的色彩很丰富,灵活运用才能提高图片的美感和区分度。本文前面是色彩理论和实例,后面是R中相关函数。

A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better. —— Donald E. Knuth 1978

简书笔记: 论文figure色彩实例 - 权衡美观与区分度 | [推荐]R语言中的渐变色 | 史上最全的图表色彩运用原理


色彩理论知识

SCI 图片用色的基本原则

sci图片的目标: 整洁干净、简洁漂亮。

  • 同一篇文章的图片颜色要注意色调的整体性,不宜出现特别鲜明刺眼的颜色(尤其是荧光绿)
  • 避免使用红绿,照顾色盲读者。可以使用红蓝代替。
  • 同一张图片色系最好统一,看起来会更加协调。
  • 同一个指标在全篇图片中最好都使用同一个颜色贯彻始终。
  • 一般用红色表示上调,绿色/蓝色表示下调。
  • 可以用渐变色来表示程度,颜色越深越多,颜色越浅越少,能够使数据显示更加直观。

以上,就是 SCI 图片用色上的一些小技巧。


Nature Genetics 2016年发表一篇关于包菜的研究文章,使用了很多颜色,怎么配色的?首先尽量避免扎眼的颜色,色彩的亮度要减少,以显得柔和,暖色系和冷色系要分开。是不是觉得很干净,很好看?

更复杂一些的,比如关于互补色、对比色的使用等颜色搭配相关的进阶知识,感兴趣的可以自行查看学习,对 SCI 图片或者是 PPT 的制作都是很有帮助的。

色彩常用语名词解释

可以直接用色轮中的相邻色和互补色确定主色。可以阅读 STHA.com 教程: choosing-colors-for-great-data-visualization-in-r

color palettes

color wheels

color schemes

color psychology

单色(hue相同,饱和度不同)Monochromatic schemes use different tones from the same angle on the color wheel (the same hue).

相似色 Analogous color schemes are created by using colors that are next to each other on the color wheel.

互补色(hue在色轮两端) Complementary schemes are created by combining colors from opposite sides of the color wheel.

三色系 Triadic schemes are made up of hues equally spaced around color wheel.

复合方案 Compound schemes are almost the same as complementary schemes. Instead of using colors that are opposites, it uses colors on both sides of the opposite hue.

figure中的色彩实例

色彩列表

微软的四种颜色

Google的四种颜色




示意图色彩

10x单细胞示意图


碱基颜色 1 (10x)

A
T
G
C
Red
Purple
Orange

碱基颜色 2 (其他来源)

A
T
G
C
IGV:A
IGV:T
IGV:G
IGV:C

Cell cycle 1

G1
Cyclin D
S
Cyclin E
G2
Cyclin A
M
Cyclin B

Cell cycle 2

G1
Cyclin D
S
Cyclin E
G2
Cyclin A
M
Cyclin B
Inter
phase



条形图色彩

条形图

pubmed id:29988129


色块图

pubmed id:33846635


bar 色块提取1

#EE3523
#919135
#68CBDD
#F7921D
#029052
#902E8E
#323B97
#00B8F0
#EC188B

bar 色块提取2


item 01

item 02

item 03

item 04

item 05

item 06

item 07


色卡集合 (使用Canvas展示)

如果使用Chrome浏览器,可以按F12打开控制台Console, 鼠标单击颜色,控制台输出16进制(hex)颜色值; 双击则输出一整行unique color的hex值; 控制台带背景色的颜色字符可以复制粘贴。

小工具: 批量选取自己喜欢的颜色, 批量By色环 | 批量ByL | 批量ByS | 仿PS颜色设置 |

Color Palette 1: 生活中的色彩

Color Palette 2: CNS paper中单细胞可视化(tSNE/ UMAP/ heatmap/ boxplot) 经典配色

Color Palette 3: 财经杂志 商务图表 知名网站

Color Palette 4: HSL色彩模型

Color Palette 5: barplot/lineplot 等色彩搭配

Color Palette 6: 色盲友好的渐变色(viridis 包),前7个适合做热图配色

viridis / ˈvɪrɪdɪs / 翠绿色 | csdn blog | viridis R包 |




R 中的657个具名色彩与色彩函数

如何使用R语言画出漂亮的图,颜色很重要,既要协调,又要有一定的分辨力。

R原生的颜色请参考本站 R 颜色

很好很强大的 R颜色列表.pdfAll 657 colors In R.html, produced by script getAllColors

查看颜色效果

R中目测查看几种颜色的区分度: 
scales::show_col( c('red','blue', '#FF9600', '#0096FF') )
barplot(rep(1,4), col=c('red','blue', '#FF9600', '#0096FF'), border = NA)

library(scales)
show_col(viridis_pal()(16), labels = FALSE)
show_col(hue_pal()(9), borders = NA) #效果见下图

color.set1=scales::hue_pal()(9); color.set1 #Seurat 的默认颜色
# "#F8766D" "#D39200" "#93AA00" "#00BA38" "#00C19F" "#00B9E3" "#619CFF" "#DB72FB" "#FF61C3"


还可以使用 barplot() 及 image() 来预览颜色。

# 1.使用 barplot() 预览颜色 palette() # R4.0 默认调色盘相对 R3.6 下调了饱和度,看着更舒服。 #"black" "#DF536B" "#61D04F" "#2297E6" "#28E2E5" "#CD0BBC" "#F5C710" "gray62" cols=palette() par(mar=c(0,0,4,0)) posX=barplot(rep(1,8), col=cols, yaxt="n", border = NA) text(posX, 1.05, labels=cols, srt=60, adj=0, col="black", xpd=T) # 2.使用 image() 预览颜色 # 按照Set1的配色的前8种 par( mar=c(1,0,4,1)) library(RColorBrewer) mypalette_1=brewer.pal(8,"Set1") mypalette_1 # "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF" image(1:8,1,as.matrix(1:8),col=mypalette_1, xlab="Set1", ylab="", mgp=c(0.1,0.5,0), xaxt="n",yaxt="n",bty="n") par("usr") text(1:8, par("usr")[4]*1.03, labels=mypalette_1, srt=60, adj=0, xpd=T, col="black", xpd=T)


1. R 内置渐变色

彩虹色

#可以拿到任意多个颜色,当然颜色越多,分辨力越低。 barplot(rep(1,8), col=rainbow(8),border=NA, axes=F) rainbow(8) # [1] "#FF0000FF" "#FFBF00FF" "#80FF00FF" "#00FF40FF" "#00FFFFFF" "#0040FFFF" # [7] "#8000FFFF" "#FF00BFFF" barplot(rep(1,20), col=rainbow(20),border=NA, axes=F) #分辨力降低

其他几个预置渐变色


par(mfrow=c(5,1), mar=c(0,0,2,0)) n=10 barplot(rep(1,n), col= rainbow(n), border=NA,axes=F, main="rainbow") #彩虹色 #heat.colors()从红色渐变到黄色,再变到白色 barplot(rep(1,n), col= heat.colors(n), border=NA,axes=F, main="heat.colors") #terrain.colors() 从绿色渐变到黄色,再到棕色,最后到白色 barplot(rep(1,n),col=terrain.colors(n), border=NA,axes=F, main="terrain.colors") #topo.colors() 从蓝色渐变到青色,再到黄色,最后到棕色 barplot(rep(1,n),col=topo.colors(n), border=NA,axes=F, main="topo.colors") #cm.colors() 从青色渐变到白色,再到粉红色 barplot(rep(1,n),col=cm.colors(n), border=NA,axes=F, main="cm.colors")

2. 预置配色与自定义渐变色

RColorBrewer 包中颜色板被划分为序列型(sequential)、离散型(diverging)、分类型(qualitative)这三种基本能满足统计作图需要的类型。


library(RColorBrewer) display.brewer.all() #显示全部颜色集合 #div", "qual", "seq", or "all" display.brewer.all(type="seq") #Sequential 连续型,浅色数字小,深色数字大 display.brewer.all(type="qual") #Qualitative 定性的,适合分类变量 display.brewer.all(type="div") #Diverging 离散型,两端强对比,中间过渡自然

brewer.pal(n, name) 获取颜色值

使用预置配色集合 Set2/Dark2,通过函数colorRampPalette()插值生成任意个渐变颜色。

# 我最喜欢中间这几组颜色了 display.brewer.all(type="qual") # 预览一个颜色集合,比如Dark2, Set2 display.brewer.pal(n = 8, name = 'RdBu') csn='Dark2' myColors=brewer.pal(8,csn) #该主题有8种颜色 par( mfrow=c(3,1), mar=c(0,1,1,0)) #bottom, left, top, right barplot(rep(1,8),col= myColors, main=csn, axes=F,border=F)

colorRampPalette() 插值,生成一组颜色

# 插值,8色生成15色 n=15 colorN=colorRampPalette(colors = myColors, interpolate ="linear")( n ) barplot(rep(1, n ),col= colorN, axes=F, border=F, main="linear") #插值方式 colorN2=colorRampPalette(colors = myColors, interpolate ="spline")( n ) barplot(rep(1, n ),col= colorN2, axes=F, border=F, main="spline") #插值方式 # 使用方法 # 推荐使用 LAB 色彩空间 Lab.palette = colorRampPalette(c("red", "orange", "blue"), space = "Lab") n=100; barplot(rep(1, n), col=Lab.palette(n), border = NA, space=0, axes=F) # 从绿色到深绿色的渐变 fun_color_range = colorRampPalette(c("Green", "darkgreen")) my_colors = fun_color_range(100) # Plotting a graph plot(1:100, pch = 20, col = my_colors) # 合并成一行 image(volcano, col = colorRampPalette(brewer.pal(9, "Purples"))(20), main = "volcano") plot(iris$Petal.Length, iris$Petal.With, col = brewer.pal(3, "Set2")[iris$Species], main = "iris")

Details: The CIE Lab color space is approximately perceptually uniform, and so gives smoother and more uniform color ramps. On the other hand, palettes that vary from one hue to another via white may have a more symmetrical appearance in RGB space.

The conversion formulas in this function do not appear to be completely accurate and the color ramp may not reach the extreme values in Lab space. Future changes in the R color model may change the colors produced with space = "Lab".

colorRamp()和colorRampPalette()的区别

两者都可用于建立颜色板,通过传入期望的主色,如蓝、紫,colorRamp()和colorRampPalette都返回一个函数。用同样的参数,结果是相同的,虽然 colorRamp()更繁琐一些。

二者返回的函数区别为:
* colorRamp()返回的函数像grey()一样,参数为[0,1]之间的数列,数列中数字个数即为函数返回的颜色数,返回值是一行一个rgb格式的颜色。
* colorRampPalette()返回的参数则像rainbow()一样,参数为希望返回颜色板色彩的数量。


par(mfrow = c(1, 2), mar=c(0,0,1,0)) #1 colorRampPalette b2p1 = colorRampPalette(c("blue", "purple")); b2p1 #返回的是一个函数 b2p1(3) #"#0000FF" "#5010F7" "#A020F0" barplot(rep(1, 12), col = b2p1(12), border = NA, space=0, axes=F, main = "colorRampPalette") #2 colorRamp b2p2 = colorRamp(c("blue", "purple")); b2p2 #返回的是一个函数 b2p2( c(0, 0.8) ) #输入是0-1之间的值,输出是一行一个rgb值 # [,1] [,2] [,3] #[1,] 0 0.0 255 #[2,] 128 25.6 243 # 转换 colorRamp() 的输出,每一行对应为一个16进制颜色值(hex) ramp2hex=function(ramp){ apply(ramp, 1, function(x){ rgb(x[1], x[2], x[3], maxColorValue = 255) }) } barplot(rep(1, 12), col = ramp2hex( b2p2(seq(0, 1, len = 12)) ), border = NA, space=0, axes=F, main = "colorRamp")

伪时间热图的渐变色设置原理

monocle 的pseudotime_heatmap的配色很显眼,十分值得借鉴。 本文只关心渐变色生成部分。

整个图的画法请参考: 伪时间平滑化热图 plot_pseudotime_heatmap (仿monocle)


############### color bar from monocle::plot_pseudotime_heatmap ############## # 这个 color bar 来自于monocle,画热图效果很好 height = 1 n=22; mid=0.75;sill=0.25;base=1 table.ramp = function (n, mid = 0.5, sill = 0.5, base = 1, height = 1) { x <- seq(0, 1, length.out = n) #0-1之间取n个值 y <- rep(0, length(x)) #等长度的0 ### 定义极值 still sill.min <- max( c(1, round( (n-1)*(mid-sill/2) ) + 1) ) #14 sill.max <- min( c(n, round( (n-1)*(mid+sill/2) ) + 1) ) #19 ########## 替换0 平台期: 围绕mid的sill极值范围内的y取1 y[sill.min:sill.max] <- 1 y ### 定义 极值 base , 范围更宽 base.min <- round( (n-1)*(mid-base/2) ) + 1 #6 base.max <- round( (n-1)*(mid+base/2) ) + 1 #27 ########## 替换1 上升部分 # xi是 still到base的min过渡态, yi则是等长的0-1之间的间距值 xi <- base.min:sill.min #[1] 6 7 8 9 10 11 12 13 14 yi <- seq(0, 1, length.out = length(xi)) # [1] 0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 1.000 # 获取xi中大于0小于等于n的元素的下标 i <- which(xi > 0 & xi <= n) #[1] 1 2 3 4 5 6 7 8 9 y[xi[i]] <- yi[i] #让y在这些位置上[6,14],值等于yi y ########## 替换2 下降部分 # xi是 still到base的max过渡态, yi则是等长的1-0之间的间距值 xi <- sill.max:base.max # [1] 19 20 21 22 23 24 25 26 27 yi <- seq(1, 0, length.out = length(xi)) #[1] 1.000 0.875 0.750 0.625 0.500 0.375 0.250 0.125 0.000 i <- which(xi > 0 & xi <= n) #[1] 1 2 3 4 y[xi[i]] <- yi[i] y height * y # [1] 0.000 0.000 0.000 0.000 0.000 0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 # [14] 1.000 1.000 1.000 1.000 1.000 1.000 0.875 0.750 0.625 } height=1 n=10 #do.call("table.ramp", as.list(c(n, c(0.8, 0.2, 1)))) #等价于 rr=table.ramp(n, 0.8,0.2,1); rr #[1] 0.0000000 0.0000000 0.0000000 0.0000000 0.3333333 0.6666667 1.0000000 #[8] 1.0000000 1.0000000 0.7500000 gg=table.ramp(n, 0.5,0.4,1); gg #[1] 0.0000000 0.3333333 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000 #[8] 0.6666667 0.3333333 0.0000000 bb=table.ramp(n, 0.2,0.2,1); bb #[1] 0.7500000 1.0000000 1.0000000 1.0000000 0.6666667 0.3333333 0.0000000 #[8] 0.0000000 0.0000000 0.0000000 par(mfrow=c(2,1), mar=c(2,2,0,1)) #b,l,t,r plot(rr, xlim=c(0.5,n+0.5), ylim=c(0,1), type='o', col='red', xaxt='n') axis(1, at=seq(1, n), labels=seq(1,n)/10, las=2,cex.axis=0.7) lines(gg, col='green', type='o') lines(bb, col='blue', type='o') # hmcols=rgb(rr, gg, bb) hmcols #[1] "#0000BF" "#0055FF" "#00AAFF" "#00FFFF" "#55FFAA" "#AAFF55" "#FFFF00" #[8] "#FFAA00" "#FF5500" "#BF0000" #color.rs=rainbow(60) posX=barplot(rep(1,length(hmcols)), col=hmcols, border = NA, space=0.1) text(posX, -0.05, labels=hmcols, #col=hmcols, xpd=TRUE, #允许绘制在绘图区外 cex=0.6, #字体是默认的倍数 adj=1, #adj=1右上对齐 srt=40) #倾斜30度)

连续型变量和渐变色的映射: cut()函数

连续型变量怎么和渐变色一一对应呢?

本例使用cut函数,实现了Y轴数字到渐变色的映射。


# cut函数: 把数值型转为因子型 #cut(x, breaks): Convert Numeric to Factor # 1. 生成数据 set.seed(20211119) dat_1=rnorm(100, 0, 1) # 测试 cut 函数 total_bins=10 #定义渐变色的阶梯数,也是数据划分的组数 dat_2=cut(dat_1, breaks=total_bins) #可以传入整数,表示分成几份;或者传入截断点数组 #table(dat_2) #total_bins=5时的结果 # (-1.87,-0.935] (-0.935,-0.0025] (-0.0025,0.93] (0.93,1.86] (1.86,2.8] # 18 26 37 15 4 # 2. 定义渐变色: 或 c('green4',"green1", "white",'maroon1', "maroon3") colors2=colorRampPalette( colors = c('green4', "white", "maroon3"), interpolate ="spline") ( length(table(dat_2)) ) # 预览颜色(optional) barplot(rep(1, length(colors2)), col=colors2, yaxt="n", space=0, border = NA) # 3. 连续型变量dat和颜色colors2的映射 plotcol = colors2[ dat_2 ]; plotcol[1:5] # 4. 画图 plot(dat_1, pch=20, mgp=c(2,0.5,0), col=plotcol, cex=0.5, bty="l", ylab="XX value")

ggplot2 中的色彩函数

Colors_(ggplot2)

coding ...

色彩进阶参考

100 color combinations and how to apply them to your designs

Color Wheel: Want to know what colors look good together? Canva's Color Wheel makes color combinations easy.

Color Palette Generator

Color Palette Ideas

最佳多色(n>10)配色程序: https://medialab.github.io/iwanthue/


更多配色方案
1. 花瓣网(https://huaban.com/)搜索「色卡」,查找别人上传的各种配色方案的卡片。
	很多色板Trending color palettes https://coolors.co/palettes/trending
2. Curated color palette inspiration. https://www.webdesignrankings.com/resources/lolcolors/
3. https://colorhunt.co/
4. https://vanschneider.com/colors
5. https://www.canva.com/learn/100-color-combinations/
6. https://color.adobe.com/zh/create/color-wheel
	https://www.sessions.edu/color-calculator/
	https://colorbrewer2.org/#type=sequential&scheme=BuGn&n=3

7. 如何创建和谐的颜色
https://www.sensationalcolor.com/creating-color-harmony/

8. D3 demo 用到的颜色 https://github.com/d3/d3/wiki/Gallery


9. 对图片的颜色进行聚类 http://www.cssdrive.com/imagepalette/

10.R中的颜色 https://qinqianshan.com/r_code/r_draw/colors-in-r/

11. 色盲色 
How to make figures and presentations that are friendly to Colorblind people: https://jfly.uni-koeln.de/color/

http://color.biaozhiku.com/