You need to enable JavaScript to run this app. ggplot2绘制多序列折线图时图例未显示问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2绘制多序列折线图时图例未显示问题咨询

图例缺失的核心原因

你当前代码里的颜色、线型参数都写在了aes()映射外部,属于固定的全局样式参数,ggplot2只会为映射到aes内部的视觉属性生成对应的图例,固定参数不会触发图例生成逻辑。
你可以用两种不破坏自定义虚线要求的方法实现带图例的绘图效果:

方法1:保留原宽表结构,手动映射绑定(无需修改数据集格式)

不需要把数据转成长表,只需要在每个geom_line()的aes()内部,把对应的y序列绑定为固定的图例标签,再手动匹配自定义的颜色、线型即可,完全保留你原代码对线条样式的要求。
可直接运行的完整代码:

ggplot(TC_merge, aes(x=Location)) + 
  # 在aes内将每个序列映射为对应的图例标签
  geom_line(aes(y = C_r_base, color = "轨道交通基线成本", linetype = "轨道交通基线成本")) + 
  geom_line(aes(y = C_a_base, color = "私人交通基线成本", linetype = "私人交通基线成本")) +
  geom_line(aes(y = C_a_after, color = "政策实施后私人交通成本", linetype = "政策实施后私人交通成本")) + 
  # 手动指定每个标签对应的颜色、线型,和你原代码样式完全一致
  scale_color_manual(values = c(
    "轨道交通基线成本" = "black",
    "私人交通基线成本" = "navyblue",
    "政策实施后私人交通成本" = "red4"
  )) +
  scale_linetype_manual(values = c(
    "轨道交通基线成本" = "dashed", # 为轨道交通序列保留虚线设置
    "私人交通基线成本" = "solid",
    "政策实施后私人交通成本" = "solid"
  )) +
  theme_classic() + 
  theme(legend.position="right") +
  labs(x = "Distance from CBD (kilometres)",
       y = "Round-trip generalised transport costs (DKK)",
       color = NULL, linetype = NULL) + # 隐藏多余的图例标题,更整洁
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  theme(text=element_text(family="Cambria", size=12)) 

这个方法的优势是不需要调整你已经整理好的宽表数据集,几行改动就能解决图例缺失的问题,同时完全保留自定义的虚线要求。

方法2:转长表的规范写法(更适配ggplot2的设计逻辑)

如果后续需要新增更多序列,这种写法不需要重复叠加多个geom_line(),维护成本更低:

  1. 先用tidyr::pivot_longer()把宽表转成长格式,将三个成本列合并为“序列名称-数值”两列
  2. 在全局aes中统一映射x、y、颜色、线型属性,再手动匹配自定义样式
    对应代码:
library(tidyr)
# 宽表转长表
tc_long <- TC_merge |> 
  pivot_longer(
    cols = c(C_r_base, C_a_base, C_a_after),
    names_to = "cost_type",
    values_to = "cost_value"
  )

# 绘图
ggplot(tc_long, aes(x = Location, y = cost_value)) +
  geom_line(aes(color = cost_type, linetype = cost_type)) +
  # 手动指定样式、自定义图例显示文本
  scale_color_manual(
    values = c(
      "C_r_base" = "black",
      "C_a_base" = "navyblue",
      "C_a_after" = "red4"
    ),
    labels = c(
      "C_r_base" = "轨道交通基线成本",
      "C_a_base" = "私人交通基线成本",
      "C_a_after" = "政策实施后私人交通成本"
    )
  ) +
  scale_linetype_manual(
    values = c(
      "C_r_base" = "dashed",
      "C_a_base" = "solid",
      "C_a_after" = "solid"
    ),
    labels = c(
      "C_r_base" = "轨道交通基线成本",
      "C_a_base" = "私人交通基线成本",
      "C_a_after" = "政策实施后私人交通成本"
    )
  ) +
  theme_classic() + 
  theme(legend.position="right") +
  labs(x = "Distance from CBD (kilometres)",
       y = "Round-trip generalised transport costs (DKK)",
       color = NULL, linetype = NULL) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  theme(text=element_text(family="Cambria", size=12))

小提示:如果color和linetype两个映射的分组标签完全一致,ggplot会自动将两个图例合并为同一个,不会出现重复的独立图例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 08:45:08