ggplot分组折线图出现双图例,如何保留所需单个图例?
问题描述
使用ggplot绘制分组折线图时出现两个图例,已调整其中一个为所需样式,但无法移除第二个,如何仅保留需要的图例?
原始代码
ggplot(data=data_Frame, aes(x=year, y=percent, group=legal, colour=as.factor(legal))) + geom_line(aes(linetype=as.factor(legal)))+ geom_point()+ geom_label_repel(aes(label = scales::percent(round(percent, digits=2))), nudge_x = 0.35, size = 3)+ labs(y= "% of total cases", x = "Year", title="Evolution of legal activity") + theme_classic()+ scale_color_discrete(name = "Legality", labels = c("Legal", "Not legal"))
数据集
structure(list(year = c(2013, 2014, 2014, 2015, 2015, 2016, 2016, 2017, 2017, 2018, 2018, 2019, 2019, 2020, 2020, 2021, 2021, 2022, 2022), legal = c(0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1), local = c("yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes"), percent = c(0.0833116184157648, 0.134483022523174, 0.231061069599069, 0.0560278636136179, 0.272460808191276, 0.10522051542274, 0.0823949547509575, 0.0902594024920258, 0.173996656575591, 0.171213948427101, 0.331143680934122, 0.136188084988968, 0.219662510799276, 0.0968133762744133, 0.216020359140314, 0.0929078672288155, 0.181961094549172, 0.0871273239449852, 0.0913038796855186)), row.names = c(NA, -19L ), class = "data.frame")
解决方案
出现两个图例的核心原因是同时使用了colour和linetype两个美学映射,它们各自生成独立图例。以下两种方法可解决问题:
方法一:合并图例(推荐)
让线型图例与颜色图例合并,统一使用你设置的名称和标签,只需给scale_linetype_discrete设置相同参数:
ggplot(data=data_Frame, aes(x=year, y=percent, group=legal, colour=as.factor(legal))) + geom_line(aes(linetype=as.factor(legal)))+ geom_point()+ geom_label_repel(aes(label = scales::percent(round(percent, digits=2))), nudge_x = 0.35, size = 3)+ labs(y= "% of total cases", x = "Year", title="Evolution of legal activity") + theme_classic()+ scale_color_discrete(name = "Legality", labels = c("Legal", "Not legal")) + scale_linetype_discrete(name = "Legality", labels = c("Legal", "Not legal"))
方法二:直接移除线型图例
若不需要通过线型区分分组,可通过guides()函数关闭线型图例:
ggplot(data=data_Frame, aes(x=year, y=percent, group=legal, colour=as.factor(legal))) + geom_line(aes(linetype=as.factor(legal)))+ geom_point()+ geom_label_repel(aes(label = scales::percent(round(percent, digits=2))), nudge_x = 0.35, size = 3)+ labs(y= "% of total cases", x = "Year", title="Evolution of legal activity") + theme_classic()+ scale_color_discrete(name = "Legality", labels = c("Legal", "Not legal")) + guides(linetype = "none")
额外优化建议
提前将legal列转换为因子,避免在映射中重复使用as.factor(),让代码更简洁:
data_Frame$legal <- factor(data_Frame$legal, levels = c(0,1), labels = c("Legal", "Not legal")) ggplot(data=data_Frame, aes(x=year, y=percent, group=legal, colour=legal, linetype=legal)) + geom_line()+ geom_point()+ geom_label_repel(aes(label = scales::percent(round(percent, digits=2))), nudge_x = 0.35, size = 3)+ labs(y= "% of total cases", x = "Year", title="Evolution of legal activity") + theme_classic()+ scale_color_discrete(name = "Legality") + scale_linetype_discrete(name = "Legality")
内容的提问来源于stack exchange,提问作者daviddupont
相关产品推荐
相关产品推荐

