You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:40:53