在7月份,本号推出了一个关于R语言配色方法的系列推文,其中第III节介绍了ggplot2
工具包的配色方法——颜色标度函数
在这篇推文中,小编介绍了针对两种变量类型的三种颜色标度函数,即
离散型变量:离散型标度
连续型变量:连续型标度、分箱型标度
其中,离散型标度是把等数目的颜色依次赋值给离散变量的各个类别,连续型标度则由用户先指定颜色的极端值(和中间值),然后再由工具包通过计算来生成连续的颜色带。
分箱型标度虽然相当于将连续型变量转化为离散型变量,但其配色思想还是类似于连续型标度,即先由用户指定颜色的极端值(和中间值),再由工具包计算其余的颜色类别,以构成具有过渡特征的离散颜色带。
这种配色方法虽然方便,但缺点是用户不能够灵活地控制所生成的颜色带,尤其对缺乏色彩知识的用户来说,由于难以准确预判生产的颜色效果而很大可能会对结果不满意。
library(ggplot2)
library(patchwork)
set.seed(20211001)
df <- data.frame(x = 1:40, y = rnorm(40))
p <- ggplot(df, aes(x, y, color = y)) +
geom_point(size = 2) +
labs(x = NULL, y = NULL)
p1 <- p + scale_color_steps(low = "blue", high = "red")
p2 <- p + scale_color_steps(low = "blue", high = "red",
breaks = c(-Inf, -1, 1, Inf))
p1 + p2
上面就是一个使用分箱型标度函数的案例,相对于左图,右图通过调用breaks
参数实现了自定义分箱的数目,但颜色选取还是比较受限制。
与之相反的是,离散型标度虽然看起来比较繁琐,但其优点恰恰是灵活,用户日常中可以积累一些好看的颜色组合,在使用时再进行手动赋值;再者,grDevices
、RColorBrewer
等工具包还提供了大量的离散调色板,用户觉得满意就可以直接调用。
可惜的是,在ggplot2
中,对连续型变量并不能调用离散型标度函数,否则会报错。如下例:
p + scale_color_brewer()
## 错误: Continuous value supplied to discrete scale
对于一些具有分类特征的变量,可以使用factor()
函数直接将其转为离散型变量(即因子变量),但这种方法并不通用。下面小编就介绍一种通用的方法,使用的函数是scale_colour_stepsn()
。
scale_colour_stepsn()
函数是分箱标度函数scale_colour_steps()
的拓展版,其可以为颜色带指定若干个临界值(极端值+中间值)。基本思路如下:
先通过
n.breaks
或breaks
参数确定分箱的数目;再通过
colors
或colours
参数指定等量的颜色临界值,在指定临界值时可以调用离散调色板。
p +
scale_color_stepsn(n.breaks = 3,
colors = grey.colors(4))
library(RColorBrewer)
p +
scale_color_stepsn(breaks = c(-1.5, 0, 1.5),
colors = brewer.pal(4, "Dark2"))
最后祝大家假期愉快!