ggplot2:如何按颜色将图例拆分为自定义图例
ggplot2: How to split legend by color into a customized legend
我很难让情节的标签看起来像某种方式。我正在使用 ggplot2 和 tidyverse。
这是我的:
我想要两个标题 (=name) 作为图例,一个用于 HCT 细胞类型,一个用于 RKO 细胞类型。然后对于 HCT 和 RKO,我想要具有各自颜色、线型和形状的试剂图例。所以基本上,我想把颜色图例分成两个独立的图例。我只是不知道如何编写代码。这是我想要的图(用于图例;请想象橙色方块已填充):
我是否需要更改 geom_line 和 geom_point 代码才能实现我想要的图例样式?或者还有另一种方法吗?我尝试寻找一种方法来做到这一点,但找不到任何东西(也许我只是没有使用正确的术语)。
我已经尝试按照此处所做的操作进行操作: and Combine legends for color and shape into a single legend 但我无法使其正常工作。 (换句话说,我尝试更改 scale_shape_manual 等以适应我的愿望但没有成功。我还尝试使用 interaction())
注意:我决定不使用 facet_wrap,因为我想在同一图上显示两种细胞类型。真实数据的情节看起来有点不同,而且没有那么压倒性。我能够使用 ggpubr 成功绘制“facet_wrap”图。
注2:我也没有使用stat_summary(),因为我需要取相同试剂浓度、试剂和细胞类型的平均值。根据我的数据,我没有找到让 stat_summary 工作的方法。
这是我目前拥有的代码:
mean_mutated <- mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
mutated_0 = mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>% filter(Reagent=="0") %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
mutated_1 = mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>% filter(Reagent=="1") %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
mutated_2 = mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>% filter(Reagent=="2") %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
#linetype by reagent
ggplot() +
#the scatter plot per cell type -> that way I can color them the way I want to, I believe
#the mean/average line plot
geom_point(mean_mutated, mapping= aes(x = as.factor(Reagent.Conc), y = Avg.Viable.Cells, shape=as.factor(Reagent), color=Cell.type)) +
geom_line(mutated_1, mapping= aes(x = as.factor(Reagent.Conc),y = Avg.Viable.Cells, group=Cell.type, color=Cell.type, linetype = "1"))+
geom_line(mutated_2, mapping= aes(x = as.factor(Reagent.Conc),y = Avg.Viable.Cells, group=Cell.type, color=Cell.type, linetype = "2"))+
geom_line(mutated_0, mapping= aes(x = as.factor(Reagent.Conc),y = Avg.Viable.Cells, group=Cell.type, color=Cell.type, linetype = "0"))+
#making the plot look prettier
scale_colour_manual(values = c("#999999", "#E69F00")) +
#scale_linetype_manual(values = c("solid", "dashed", "dotted")) + #for whatever reason, when I add this, the dash in the legend is removed...?
labs(shape = "Reagent", linetype = "Reagent", color="Cell type")+
scale_shape_manual(values=c(15,16,4), labels=c("0", "1", "2"))+
#guides(shape = FALSE)+ #this removes the label that you don't want
#Change the look of the plot and change the axes
xlab("[Reagent] (nM/ml)")+ #change name of x-axis
ylab("Relative viability")+ #change name of y-axis
scale_y_continuous(breaks = scales::pretty_breaks(n = 10))+ #adjust the y-axis so that it has more ticks
expand_limits(y = 0)+
theme_bw() + #this and the next line are to remove the background grid and make it look more publication-like
theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))
以及由 dput(df[9:32, c(1,2,3,4,5)]) 生成的我的数据框“变异”的快照:
structure(list(Biological.Replicate = c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L), Reagent.Conc = c(10000, 2500, 625, 156.3, 39.1, 9.8,
2.4, 0.6, 10000, 2500, 625, 156.3, 39.1, 9.8, 2.4, 0.6, 10000,
2500, 625, 156.3, 39.1, 9.8, 2.4, 0.6), Reagent = c(1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Cell.type = c("HCT", "HCT", "HCT", "HCT",
"HCT", "HCT", "HCT", "HCT", "HCT", "HCT", "HCT", "HCT", "HCT",
"HCT", "HCT", "HCT", "RKO", "RKO", "RKO", "RKO", "RKO", "RKO",
"RKO", "RKO"), Mean.Viable.Cells.1 = c(1.014923966, 1.022279854,
1.00926559, 0.936979842, 0.935565248, 0.966403395, 1.00007073,
0.978144524, 1.019673384, 0.991595836, 0.977270557, 1.007353643,
1.111928183, 0.963518289, 0.993028364, 1.027409034, 1.055452733,
0.953801253, 0.956577449, 0.792568337, 0.797052961, 0.755623576,
0.838482346, 0.836773918)), row.names = 9:32, class = "data.frame")
注意 3:尽管一列名称是“Mean.Viable.Cells.1”,但这不是我正在绘制的平均值,而是之前计算的技术复制的平均值。我正在使用 mutated_0、mutated_1 和 mutated_2 中的生物复制的平均值来绘制它。
使用 ggnewscale
包可以这样实现:
- 在处理数据集之前将
Cell.Type
和 Reagent
转换为因子
- 不需要数据集
mutate_0
,...您只需要一个汇总数据集,我将其拆分为Cell.type
以便稍后简化代码。
- 为了得到你想要的结果,分别为每种细胞类型绘制你的数据。这就是我按细胞类型拆分数据的原因
- 要获得单独的图例,请使用
ggnewscale::new_scale
为 linetype
和 shape
添加第二个比例和图例。此外,从美学中删除color
并将其设置为参数
- 至少对于您的数据片段,您必须将
drop=FALSE
添加到两个量表以保持未使用的因子水平。
- 最后,为了减少代码重复,我使用辅助函数为每个
Cell.type
. 添加几何图形和比例尺
library(ggplot2)
library(dplyr)
mutated <- mutated %>%
mutate(Cell.type = factor(Cell.type, levels = c("HCT", "RKO")),
Reagent = factor(Reagent, levels = c("0", "1", "2"))
)
mean_mutated <- mutated %>%
group_by(Reagent, Reagent.Conc, Cell.type) %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE)) %>%
split(.$Cell.type)
#> `summarise()` has grouped output by 'Reagent', 'Reagent.Conc'. You can override using the `.groups` argument.
layer_geom_scale <- function(cell_type, color) {
list(
geom_point(mean_mutated[[cell_type]], mapping = aes(shape = Reagent), color = color),
geom_line(mean_mutated[[cell_type]], mapping = aes(group = Reagent, linetype = Reagent), color = color),
scale_linetype_manual(name = cell_type, values = c("solid", "dashed", "dotted"), drop=FALSE),
scale_shape_manual(name = cell_type, values = c(15, 16, 4), labels = c("0", "1", "2"), drop=FALSE)
)
}
# linetype by reagent
ggplot(mapping = aes(
x = as.factor(Reagent.Conc),
y = Avg.Viable.Cells
)) +
layer_geom_scale("HCT", "#999999") +
ggnewscale::new_scale("linetype") +
ggnewscale::new_scale("shape") +
layer_geom_scale("RKO", "#E69F00") +
scale_y_continuous(breaks = scales::pretty_breaks(n = 10), limits = c(0, NA)) +
theme_bw() +
theme(
panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")
) +
labs(shape = "Reagent",
linetype = "Reagent",
color = "Cell type",
x = "[Reagent] (nM/ml)",
y = "Relative viability")
我很难让情节的标签看起来像某种方式。我正在使用 ggplot2 和 tidyverse。
这是我的:
我想要两个标题 (=name) 作为图例,一个用于 HCT 细胞类型,一个用于 RKO 细胞类型。然后对于 HCT 和 RKO,我想要具有各自颜色、线型和形状的试剂图例。所以基本上,我想把颜色图例分成两个独立的图例。我只是不知道如何编写代码。这是我想要的图(用于图例;请想象橙色方块已填充):
我是否需要更改 geom_line 和 geom_point 代码才能实现我想要的图例样式?或者还有另一种方法吗?我尝试寻找一种方法来做到这一点,但找不到任何东西(也许我只是没有使用正确的术语)。
我已经尝试按照此处所做的操作进行操作:
注意:我决定不使用 facet_wrap,因为我想在同一图上显示两种细胞类型。真实数据的情节看起来有点不同,而且没有那么压倒性。我能够使用 ggpubr 成功绘制“facet_wrap”图。
注2:我也没有使用stat_summary(),因为我需要取相同试剂浓度、试剂和细胞类型的平均值。根据我的数据,我没有找到让 stat_summary 工作的方法。
这是我目前拥有的代码:
mean_mutated <- mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
mutated_0 = mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>% filter(Reagent=="0") %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
mutated_1 = mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>% filter(Reagent=="1") %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
mutated_2 = mutated %>% group_by(Reagent, Reagent.Conc, Cell.type) %>% filter(Reagent=="2") %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE))
#linetype by reagent
ggplot() +
#the scatter plot per cell type -> that way I can color them the way I want to, I believe
#the mean/average line plot
geom_point(mean_mutated, mapping= aes(x = as.factor(Reagent.Conc), y = Avg.Viable.Cells, shape=as.factor(Reagent), color=Cell.type)) +
geom_line(mutated_1, mapping= aes(x = as.factor(Reagent.Conc),y = Avg.Viable.Cells, group=Cell.type, color=Cell.type, linetype = "1"))+
geom_line(mutated_2, mapping= aes(x = as.factor(Reagent.Conc),y = Avg.Viable.Cells, group=Cell.type, color=Cell.type, linetype = "2"))+
geom_line(mutated_0, mapping= aes(x = as.factor(Reagent.Conc),y = Avg.Viable.Cells, group=Cell.type, color=Cell.type, linetype = "0"))+
#making the plot look prettier
scale_colour_manual(values = c("#999999", "#E69F00")) +
#scale_linetype_manual(values = c("solid", "dashed", "dotted")) + #for whatever reason, when I add this, the dash in the legend is removed...?
labs(shape = "Reagent", linetype = "Reagent", color="Cell type")+
scale_shape_manual(values=c(15,16,4), labels=c("0", "1", "2"))+
#guides(shape = FALSE)+ #this removes the label that you don't want
#Change the look of the plot and change the axes
xlab("[Reagent] (nM/ml)")+ #change name of x-axis
ylab("Relative viability")+ #change name of y-axis
scale_y_continuous(breaks = scales::pretty_breaks(n = 10))+ #adjust the y-axis so that it has more ticks
expand_limits(y = 0)+
theme_bw() + #this and the next line are to remove the background grid and make it look more publication-like
theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))
以及由 dput(df[9:32, c(1,2,3,4,5)]) 生成的我的数据框“变异”的快照:
structure(list(Biological.Replicate = c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L), Reagent.Conc = c(10000, 2500, 625, 156.3, 39.1, 9.8,
2.4, 0.6, 10000, 2500, 625, 156.3, 39.1, 9.8, 2.4, 0.6, 10000,
2500, 625, 156.3, 39.1, 9.8, 2.4, 0.6), Reagent = c(1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Cell.type = c("HCT", "HCT", "HCT", "HCT",
"HCT", "HCT", "HCT", "HCT", "HCT", "HCT", "HCT", "HCT", "HCT",
"HCT", "HCT", "HCT", "RKO", "RKO", "RKO", "RKO", "RKO", "RKO",
"RKO", "RKO"), Mean.Viable.Cells.1 = c(1.014923966, 1.022279854,
1.00926559, 0.936979842, 0.935565248, 0.966403395, 1.00007073,
0.978144524, 1.019673384, 0.991595836, 0.977270557, 1.007353643,
1.111928183, 0.963518289, 0.993028364, 1.027409034, 1.055452733,
0.953801253, 0.956577449, 0.792568337, 0.797052961, 0.755623576,
0.838482346, 0.836773918)), row.names = 9:32, class = "data.frame")
注意 3:尽管一列名称是“Mean.Viable.Cells.1”,但这不是我正在绘制的平均值,而是之前计算的技术复制的平均值。我正在使用 mutated_0、mutated_1 和 mutated_2 中的生物复制的平均值来绘制它。
使用 ggnewscale
包可以这样实现:
- 在处理数据集之前将
Cell.Type
和Reagent
转换为因子 - 不需要数据集
mutate_0
,...您只需要一个汇总数据集,我将其拆分为Cell.type
以便稍后简化代码。 - 为了得到你想要的结果,分别为每种细胞类型绘制你的数据。这就是我按细胞类型拆分数据的原因
- 要获得单独的图例,请使用
ggnewscale::new_scale
为linetype
和shape
添加第二个比例和图例。此外,从美学中删除color
并将其设置为参数 - 至少对于您的数据片段,您必须将
drop=FALSE
添加到两个量表以保持未使用的因子水平。 - 最后,为了减少代码重复,我使用辅助函数为每个
Cell.type
. 添加几何图形和比例尺
library(ggplot2)
library(dplyr)
mutated <- mutated %>%
mutate(Cell.type = factor(Cell.type, levels = c("HCT", "RKO")),
Reagent = factor(Reagent, levels = c("0", "1", "2"))
)
mean_mutated <- mutated %>%
group_by(Reagent, Reagent.Conc, Cell.type) %>%
summarise(Avg.Viable.Cells = mean(Mean.Viable.Cells.1, na.rm = TRUE)) %>%
split(.$Cell.type)
#> `summarise()` has grouped output by 'Reagent', 'Reagent.Conc'. You can override using the `.groups` argument.
layer_geom_scale <- function(cell_type, color) {
list(
geom_point(mean_mutated[[cell_type]], mapping = aes(shape = Reagent), color = color),
geom_line(mean_mutated[[cell_type]], mapping = aes(group = Reagent, linetype = Reagent), color = color),
scale_linetype_manual(name = cell_type, values = c("solid", "dashed", "dotted"), drop=FALSE),
scale_shape_manual(name = cell_type, values = c(15, 16, 4), labels = c("0", "1", "2"), drop=FALSE)
)
}
# linetype by reagent
ggplot(mapping = aes(
x = as.factor(Reagent.Conc),
y = Avg.Viable.Cells
)) +
layer_geom_scale("HCT", "#999999") +
ggnewscale::new_scale("linetype") +
ggnewscale::new_scale("shape") +
layer_geom_scale("RKO", "#E69F00") +
scale_y_continuous(breaks = scales::pretty_breaks(n = 10), limits = c(0, NA)) +
theme_bw() +
theme(
panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")
) +
labs(shape = "Reagent",
linetype = "Reagent",
color = "Cell type",
x = "[Reagent] (nM/ml)",
y = "Relative viability")