R - 在不同的箱线图中为每个组保持相同的颜色

R - Keep the same color for each group in different boxplots

好久reader第一次发帖,如有错误敬请见谅

我有一个包含多个因素的数据集,我想为每个因素分配一种颜色,这样当我绘制一组因素时,颜色保持不变。

我可以举个简单的例子

# Generating a random dataset
df <- data.frame(values = runif(20, min=0, max=10), groups = rep(c("A","B","C","D"), each = 5))
df$groups <- as.factor(df$groups)

df

values groups
1  9.3959013      A
2  6.0607064      A
3  3.3956529      A
4  7.9427183      A
5  9.4938858      A
6  4.4047519      B
7  0.7775106      B
8  2.0356925      B
9  6.9077875      B
10 3.8141609      B
11 2.6100288      C
12 8.5189150      C
13 3.5696664      C
14 7.8106244      C
15 7.2489862      C
16 6.4197579      D
17 6.4479676      D
18 8.9319776      D
19 2.0124674      D
20 5.2652708      D

当我绘制每个组时,我想将“红色”分配给 A,将“黄色”分配给 B 等等:

ggplot(df, aes(x=groups, y=values, fill=groups))+
geom_boxplot()+
scale_fill_manual(values=c("red", "yellow", "green", "blue"))

plot 1

现在,如果我只想绘制 A、C 和 D,我希望 A 保持红色、C 绿色和 D 蓝色

ggplot(df[!df$groups=="B",], aes(x=groups, y=values, fill=groups))+
geom_boxplot()+
scale_fill_manual(values=c("red", "green", "blue"))

plot 2

或者如果我只绘制 C 和 D,我希望它们保持绿色和蓝色。

我通常不手动分配颜色,而是使用预先设计的调色板,例如 viridis,但如果我使用 scale_fill_viridis,箱线图中显示的第一组始终是紫色,最后一组是黄色.

我想过创建一个调色板,为每个因素分配一种颜色:

palette <- data.frame(factors= levels(df$groups),  colors= viridis_pal() 
(length(levels(df$groups))))

palette

factors    colors
1       A #440154FF
2       B #31688EFF
3       C #35B779FF
4       D #FDE725FF

但我不知道如何将其集成到 ggplot 中。

非常感谢!

您可以通过 tibble::deframe 将带有颜色的 df 转换为命名向量,然后可以将其传递给 scale_fill_manual,如下所示:

library(ggplot2)

set.seed(42)

df <- data.frame(values = runif(20, min=0, max=10), groups = rep(c("A","B","C","D"), each = 5))
df$groups <- as.factor(df$groups)

palette <- data.frame(factors = levels(df$groups),  colors= scales::viridis_pal()(length(levels(df$groups))))
palette <- tibble::deframe(palette)

ggplot(df, aes(x=groups, y=values, fill=groups))+
  geom_boxplot()+
  scale_fill_manual(values = palette)