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)
好久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)