首先我反正是才知道,怎么知道的呢?摸鱼莫得~~
在 twitter 上摸鱼看到这样一条消息:
Did you know the latest version of ggplot2 allows you to set the default colour/fill scale functions via global options?
然后我就来到了这里:
Discrete colour scales
默认配色
首先我们通过官方自带的示例来看 ggplot2 默认的配色是什么样的?
library(ggplot2)
# 为了后面出图显得代码不冗余,这里编写了一个函数
cty_by_var <- function(var) {
ggplot(mpg, aes(cty, colour = factor({{var}}), fill = factor({{var}}))) +
geom_density(alpha = 0.2)
}
cty_by_var(class)
emm,可以看到,典型的 ggplot2 风格。那么我们怎么修改 ggplot2 默认颜色搭配呢?
修改 ggplot2 默认配色
这里不得不提到一个参数 ggplot2.discrete.fill = ...
,顾名思义,离散型颜色填充。
# 指定颜色集(一个对色盲用户者比较友好的配色)
okabe <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
# 通过with_options() 函数局部改变 ggplot2 配色,如果需要全局改变,那么就用 `options()` 函数
withr::with_options(
list(ggplot2.discrete.fill = okabe),
print(cty_by_var(class))
)
这个时候来看这个图的颜色,是不是变了?而且比较顺眼一些了。
根据 levels 数目来自动匹配配色方案
discrete_palettes <- list(
c("skyblue", "orange"),
RColorBrewer::brewer.pal(3, "Set2"),
RColorBrewer::brewer.pal(6, "Accent")
)
> discrete_palettes
[[1]]
[1] "skyblue" "orange"
[[2]]
[1] "#66C2A5" "#FC8D62" "#8DA0CB"
[[3]]
[1] "#7FC97F" "#BEAED4" "#FDC086" "#FFFF99" "#386CB0" "#F0027F"
然后可以将以上颜色集列表一一对应不同的图的默认颜色
withr::with_options(
list(ggplot2.discrete.fill = discrete_palettes), {
# 1st palette is used when there 1-2 levels (e.g., year)
# 当只有 1-2 个 levels 时候采用第一种配色方案
print(cty_by_var(year))
# 当有 3 个 levels 时候采用第二种配色
# 2nd palette is used when there are 3 levels
print(cty_by_var(drv))
# 当有 4-6 个 levels 时候采用第三种配色方案
# 3rd palette is used when there are 4-6 levels
print(cty_by_var(fl))
})
也可以分开写
- 1-2 个 levels 时候(这里两个)
withr::with_options(
list(ggplot2.discrete.fill = discrete_palettes), {
print(cty_by_var(year))
})
- 三个 levels 时候
withr::with_options(
list(ggplot2.discrete.fill = discrete_palettes), {
print(cty_by_var(drv))
})
- 4-6 个 levels 时候(这里五个)
withr::with_options(
list(ggplot2.discrete.fill = discrete_palettes), {
print(cty_by_var(fl))
})
小结
我觉得这种针对于不用 levels 数目,提供不同的配色配色方案,对于我们在编写可视化函数配色方面还是很方便的。
不过往往我们在发表文章的时候,更多的时候还是按照同一个样品或者变量在通篇文章中采用一个配色,所以我一般经常使用的配色方案是通过 scale_fill_manual()
或者 scale_color_manual()
中的 values
参数来实现,举个例子,有变量 var_A、var_B、var_C
,我就会这样实现:
scale_fill_manual(values = c(var_A = "red", var_B = "grey", var_C = "blue"))
or
scale_color_manual(values = c(var_A = "red", var_B = "grey", var_C = "blue"))