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

如何在R的ggplot2绘图中添加自定义图例?

为ggplot2图表添加自定义图例的实现方案

现有基于MeRe2数据集的ggplot2绘图代码,绘制了四个系列(BAU、Lw、Md、High)的点和线,但未生成图例。需要在图表右上角添加图例,对应关系为:BAU(红色)、Low(橙色)、Medium(蓝色)、High(绿色)。


核心解决方案

原代码的问题在于直接在geom层指定颜色,未将颜色映射到数据变量,导致ggplot无法自动生成图例。推荐通过转换数据格式+颜色映射的方式实现,代码更简洁易维护:

# 加载依赖包(未安装需先执行 install.packages(c("tidyr", "ggplot2")))
library(tidyr)
library(ggplot2)

# 将宽格式数据转换为长格式(ggplot2分组可视化的标准格式)
MeRe2_long <- pivot_longer(MeRe2, 
                           cols = c(BAU, Lw, Md, High), 
                           names_to = "Scenario", 
                           values_to = "SOC_Stock")

# 绘制图表并添加自定义图例
ggplot(MeRe2_long, aes(x = Years, y = SOC_Stock, color = Scenario)) +
  geom_point() +
  geom_line() +
  # 自定义颜色与图例标签
  scale_color_manual(
    values = c(
      "BAU" = "red",
      "Lw" = "orange",
      "Md" = "blue",
      "High" = "green"
    ),
    labels = c(
      "BAU" = "BAU",
      "Lw" = "Low",
      "Md" = "Medium",
      "High" = "High"
    )
  ) +
  scale_x_continuous(breaks = MeRe2$Years) +
  xlab("Years from Now") +
  ylab("Total SOC Stocks in BC Soils (TonC/ha)") +
  # 指定图例位置为右上角
  theme(legend.position = "topright")

关键改动说明

  • 数据格式转换:用pivot_longer()将原宽格式数据转为长格式,把4个系列列合并为Scenario(场景名称)和SOC_Stock(SOC储量)两列,这是ggplot2实现分组映射的标准方式。
  • 颜色映射:在主ggplot()的aes()中指定color = Scenario,让ggplot自动将不同场景与颜色关联,生成图例框架。
  • 自定义图例:通过scale_color_manual()指定每个场景对应的颜色,并将Lw、Md重命名为Low、Medium,匹配需求的图例文本。
  • 图例位置:用theme(legend.position = "topright")明确指定图例位置,也可根据需求调整为"top"、"bottom"等。

不转换数据的替代方案(不推荐,代码冗余)

如果不想修改数据格式,也可以手动在每个geom层的aes()中指定颜色映射,再绑定颜色:

ggplot(MeRe2, aes(x = Years)) +
  geom_point(aes(y = BAU, color = "BAU")) +
  geom_line(aes(y = BAU, color = "BAU")) +
  geom_point(aes(y = Lw, color = "Low")) +
  geom_line(aes(y = Lw, color = "Low")) +
  geom_point(aes(y = Md, color = "Medium")) +
  geom_line(aes(y = Md, color = "Medium")) +
  geom_point(aes(y = High, color = "High")) +
  geom_line(aes(y = High, color = "High")) +
  scale_color_manual(
    values = c("BAU" = "red", "Low" = "orange", "Medium" = "blue", "High" = "green"),
    name = "Scenario"
  ) +
  scale_x_continuous(breaks = MeRe2$Years) +
  xlab("Years from Now") +
  ylab("Total SOC Stocks in BC Soils (TonC/ha)") +
  theme(legend.position = "topright")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:05:14