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

如何基于多个不同dataframe在ggplot中手动创建线型分类图例

解决方案

核心问题

你现有代码无法生成图例的核心原因是:你在geom_smooth()的全局参数中重复定义了linetype值,直接覆盖了aes()内部的线型映射规则,ggplot会默认你不需要生成对应的映射图例。

修正代码(无需合并数据框)

library(ggplot2)

# 你的示例数据部分(可保留原有定义)
mydf1 <- data.frame(x = c(seq(-1,1, 0.2)),
                    predicted = c(-0.27066438, -0.23568714, -0.20070991, -0.16573267, -0.13075543, -0.09577819, -0.06080095, -0.02582371,  0.00915353,  0.04413077,  0.07910801))

mydf2 <- data.frame(x = c(seq(-1,1, 0.2)),
                    predicted = c(-0.39806988, -0.34348641, -0.28890295, -0.23431948, -0.17973602, -0.12515255, -0.07056909, -0.01598562,  0.03859784,  0.09318131,  0.14776477))

mydf3 <- data.frame(x = c(seq(-1,1, 0.2)),
                    predicted = c(-0.25520076, -0.22917917, -0.20315758, -0.17713600, -0.15111441, -0.12509282, -0.09907123, -0.07304964, -0.04702806, -0.02100647, 0.00501512))

# 修正后的绘图代码
ggplot() + 
  geom_smooth(data = mydf1, aes(x = x, y = predicted, linetype = "Group 1"), method = "lm", colour = "black") +
  geom_smooth(data = mydf2, aes(x = x, y = predicted, linetype = "Group 2"), method = "lm", colour = "black") +
  geom_smooth(data = mydf3, aes(x = x, y = predicted, linetype = "Group 3"), method = "lm", colour = "black") +
  scale_linetype_manual(
    name = "分组", # 可自定义图例标题
    values = c("Group 1" = 1, "Group 2" = 2, "Group 3" = 3)
  ) +
  theme_classic()

调整说明

  • 删除了每个geom_smooth()外层的硬编码linetype参数,避免覆盖aes()内的映射规则
  • 在aes()内直接将linetype映射为对应的分组名称,无需用数字中转
  • 通过scale_linetype_manual手动指定每个分组对应的线型,匹配你需要的显示效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:36:05