日常瞎掰
一图胜千言,说明了其作为一种展现形式在呈现数据结果时的重要性。虽说图的本质是用来展示结果,其最主要的功能是以简单的形式说明数据中蕴含的意义,但有时候好看的外表也是一种加分项,例如图型的布局,颜色搭配等。好的颜色搭配不仅看起来赏心悦目,更重要的作用应该是能增加数据中的辨识度,给人一目了然的感觉,而不是晕倒在五彩斑斓的迷离中。虽然俺也不善于颜色搭配,但这并不妨碍咱站在巨人的肩膀上来为图增添一抹色彩。下面咱们就来谈谈R语言里,那些好用的配色方案。
RColorBrewer
RColorBrewer
包做为老牌调色板,其提供了3类调色板:1、连续性(sequential)
,生成一系列连续渐变的颜色(共18组颜色,每组9个渐变色);2、 离散型(diverging),生成两端深色、中部浅色的系列颜色(共9组颜色,每组11个颜色),可用来标记数据中的离群点,适用于突显极端数值;3、定性型(qualitative),生成一些列彼此差异比较明显的颜色,通常用来标记分类数据。
- 颜色查看
display.brewer.all
可用来展示预设调色板,默认展示所有调色板,也可指定名称展示某个调色板。brewer.pal.info
也可用来查看调色板的信息。
display.brewer.all(type='seq')
display.brewer.all(type='div')
display.brewer.all(type='qual')
display.brewer.all(6, select='Set1')
display.brewer.all()
结果如下:
- 颜色使用
brewer.pal
函数用来使用调色板的颜色,需要两个参数:第一个指定颜色数量,最大为选取的调色板的颜色个数;第二个是调色板名称:
mycolor <- brewer.pal(8,'Set1')
mycolor
[1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
image(1:8,1,as.matrix(1:8),col=mycolor,xlab='',ylab='',axes=F)
结果如下:
- 自定义颜色
colorRampPalette
函数可以根据给定的颜色返回一个颜色生成函数,可以调用这个颜色函数生成一系列颜色,数量可以自定义。该方法很适合生成渐变色:
mycolor <- colorRampPalette(c('red','blue'))(10)
mycolor
[1] "#FF0000" "#E2001C" "#C60038" "#AA0055" "#8D0071" "#71008D" "#5500AA"
[8] "#3800C6" "#1C00E2" "#0000FF"
image(1:10,1,as.matrix(1:10),col=mycolor,xlab='',ylab='',axes=F)
结果如下:
colorRamp
函数也可根据给定颜色返回一个颜色函数,然后调用颜色来生成一系列颜色,该方法会返回一个矩阵,内含RGB
格式的颜色编码,一行一个颜色,可以借助rgb
函数来解读:
colmat <- colorRamp(c("blue", "green"))((0:4)/4)
colmat
[,1] [,2] [,3]
[1,] 0 0.00 255.00
[2,] 0 63.75 191.25
[3,] 0 127.50 127.50
[4,] 0 191.25 63.75
[5,] 0 255.00 0.00
mycolor <- rgb(colmat,max=255)
mycolor
[1] "#0000FF" "#003FBF" "#007F7F" "#00BF3F" "#00FF00"
image(1:5,1,as.matrix(1:5),col=mycolor,xlab='',ylab='',axes=F)
结果如下:
使用该方法需要注意一点,调用颜色函数时,输入的是[0-1]
的数字向量,如这里的(0:4)/4
为向量c(0.00, 0.25, 0.50, 0.75, 1.00)
,一个数字会生成一个颜色。
colorRamp2
colorRamp2
函数来自于R包circlize
,从名字可以看出该函数与上面的colorRamp
关系。该函数根据指定端点向量和颜色向量返回一个颜色函数,然后调用颜色函数时输入一个数字向量,就会根据值的大小映射不同的颜色。可见,该函数很适用于热图:
library(circlize)
col_fun <- colorRamp2(c(-1, 0, 1), c("green", "white", "red"))
mycolor <- col_fun(c(-2, -1, -0.5, 0, 0.5, 1, 2))
mycolor
[1] "#00FF00FF" "#00FF00FF" "#B1FF9AFF" "#FFFFFFFF" "#FF9E81FF" "#FF0000FF" "#FF0000FF"
image(1:5,1,as.matrix(1:5),col=mycolor,xlab='',ylab='',axes=F)
结果如下:
DiscretePalette_scCustomize
该函数来自于单细胞可视化scCustomize
包,里面内置了两大类颜色调色板:
- Continuous Palettes
viridis_plasma_dark_high
viridis_plasma_light_high
viridis_magma_dark_high
viridis_magma_light_high
viridis_inferno_dark_high
viridis_inferno_light_high
viridis_dark_high
p1 <- FeaturePlot_scCustom(seurat_object = pbmc, features = "CD3E")
p2 <- FeaturePlot_scCustom(seurat_object = pbmc, colors_use = viridis_magma_dark_high, features = "CD3E")
p3 <- FeaturePlot_scCustom(seurat_object = pbmc, colors_use = viridis_inferno_dark_high, features = "CD3E")
p4 <- FeaturePlot_scCustom(seurat_object = pbmc, colors_use = viridis_light_high, features = "CD3E")
结果如下:
- Discrete Palettes
alphabet (24)
alphabet2 (24)
glasbey (32)
polychrome (36)
stepped (24)
ditto_seq (40)
varibow (Dynamic)
PalettePlot(palette = DiscretePalette_scCustomize(num_colors = 26, palette = "alphabet"))
PalettePlot(palette = c("color1", "color2", ...)
结果如下:
结束语
颜色搭配对于可视化来说还是有一定影响的,虽然说大家的审美观可能不一致,没有必要追求让所有人都认可的美,但在不过分耗费时间的基础上做出符合大众审美的图岂不是美哉!毕竟,图是用来展示给别人看的,美不美观可能影响到的不仅仅是图像本身了!既然,现在有了这么多现成的配色方案,咱们也可以顺手为自己的图润色来提升一下颜值了。
往期回顾
saddleplot | A/B compartments
双曲线火山图一键拿捏
ChIP-seq数据质控
ChatGPT!见证AI的力量!
ChIPseeker绘图函数借用