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

ggplot中geom_smooth设置show.legend=TRUE仍不显示图例问题

解决ggplot图例不显示的问题

你的代码里图例不显示的核心原因是:把color参数写在了aes()外面。这种写法是直接给图层指定固定颜色,不属于ggplot的"映射"逻辑,所以哪怕设置show.legend=TRUE也不会生成图例。

修复方案1:将颜色移入aes()映射

把颜色标识作为字符串放在aes()里,让ggplot识别为分组变量,再通过scale_colour_manual匹配颜色和标签:

a <- data.frame(x=seq(1,100,1), y=rnorm(100))
b <- data.frame(x=seq(1,100,1), y=rnorm(100))

graph1 <- ggplot()+
  geom_smooth(data = a, aes(x, y, color = "Legend 1"),
              method = lm, formula = y ~ splines::bs(x, 3), se = FALSE,
              linewidth = 0.4)+
  geom_smooth(data = b, aes(x, y, color = "Legend 2"),
              method = lm, formula = y ~ splines::bs(x, 3), se = FALSE,
              linewidth = 0.4)+
  scale_colour_manual(name="", 
                      values = c("Legend 1" = "red", "Legend 2" = "blue"))

修复方案2:合并数据集(更推荐)

把两个数据集合并,新增分组列,用统一的aes()映射分组,代码更简洁易维护:

# 合并数据集并添加分组标识
combined_data <- rbind(
  cbind(a, group = "Legend 1"),
  cbind(b, group = "Legend 2")
)

graph1 <- ggplot(combined_data, aes(x, y, color = group)) +
  geom_smooth(method = lm, formula = y ~ splines::bs(x, 3), 
              se = FALSE, linewidth = 0.4) +
  scale_colour_manual(name = "", values = c("red", "blue"))

两种方案都能正常生成图例,其中第二种更符合ggplot的语法设计,后续如果要添加更多分组也更方便。

内容的提问来源于stack exchange,提问作者user23523919

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:12:35