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

如何在R的ggplot2中自定义折线图图例,合并线型与颜色?

解决ggplot2折线图图例合并问题

你的问题根源在于当前代码用多个geom_line分别定义颜色和线型映射,导致ggplot把颜色、线型当成两个独立的图例。要实现颜色+线型合并的图例,最简洁的方法是先把宽格式数据转成长格式,再用同一个变量同时映射颜色和线型。

步骤1:转换数据格式(宽→长)

用tidyr包的pivot_longer把分散的列合并成统一的类别列,这是ggplot2的最佳实践,能大幅简化代码:

library(tidyr)
library(ggplot2)

# 将宽格式数据转为长格式
df_long <- df7Q2 %>%
  pivot_longer(
    cols = -REF_DATE,  # 保留日期列,转换其余所有增长率列
    names_to = "Category",  # 新列:存储类别(如Shelter_M、Energy_Y)
    values_to = "Growth"    # 新列:存储CPI增长率数值
  )

步骤2:绘制合并图例的折线图

现在只需要一个geom_line,将color、linetype、group都绑定到同一个Category变量,ggplot会自动合并图例:

ggplot(df_long, aes(x = REF_DATE)) +
  geom_line(aes(y = Growth, color = Category, linetype = Category, group = Category), size = 1.5) +
  # 自定义颜色,和你原代码的设置一致
  scale_color_manual(
    values = c(
      "Shelter_M" = "#26495c", 
      "Energy_M" = "#c4a35a", 
      "Food_M" = "#c66b3d", 
      "Shelter_Y" = "#26495c", 
      "Energy_Y" = "#c4a35a", 
      "Food_Y" = "#c66b3d"
    )
  ) +
  # 自定义线型,和你原代码的设置一致
  scale_linetype_manual(
    values = c(
      "Shelter_M" = "dashed", 
      "Energy_M" = "dashed", 
      "Food_M" = "dashed", 
      "Shelter_Y" = "solid", 
      "Energy_Y" = "solid", 
      "Food_Y" = "solid"
    )
  ) +
  labs(
    title = "Shelter、Energy、Food的CPI月环比与同比增长率对比",
    x = "月份",
    y = "消费者价格指数增长率"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    legend.key.width = unit(2, "cm")
  )

效果说明

这样设置后,图例会自动合并为一个,每个条目同时显示对应的颜色和线型:

  • Shelter_M:深灰色虚线
  • Energy_M:橄榄色虚线
  • Food_M:橙色虚线
  • Shelter_Y:深灰色实线
  • Energy_Y:橄榄色实线
  • Food_Y:橙色实线

原代码里的scale_size因为没有实际作用(已经在geom_line里固定了size=1.5),所以直接删掉即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:33:20