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

在ggplot2中使用表达式作图例标签时如何合并线型与颜色图例?

解决ggplot2中线型与颜色图例合并问题

当使用表达式(如希腊符号)作为图例标签时,ggplot2会因标签类型不匹配拆分原本可合并的线型与颜色图例,以下是具体解决方法:

问题复现

先看导致图例拆分的典型代码:

library(ggplot2)

set.seed(123) # 固定随机种子保证结果可复现
data <- data.frame(Train = rep(c(20,30,40,50),2), xi = runif(8,0,1), category = c(rep("0.3_val",4),rep("0.3_test",4)))
data <- rbind(data, data.frame(Train = rep(c(20,30,40,50),2), xi = runif(8,0,1), category = c(rep("0.6_val",4),rep("0.6_test",4))))

# 此代码会拆分图例:color用表达式标签,linetype用普通字符标签
ggplot(data, aes(x = Train, y = xi, color = category, linetype = category)) +
  geom_line() +
  scale_color_manual(
    values = c("0.3_val" = "red", "0.3_test" = "blue", "0.6_val" = "darkred", "0.6_test" = "darkblue"),
    labels = c(expression(paste(xi, "=0.3 (训练)")), expression(paste(xi, "=0.3 (测试)")),
               expression(paste(xi, "=0.6 (训练)")), expression(paste(xi, "=0.6 (测试)")))
  ) +
  scale_linetype_manual(
    values = c("0.3_val" = 1, "0.3_test" = 2, "0.6_val" = 1, "0.6_test" = 2),
    labels = c("xi=0.3 (训练)", "xi=0.3 (测试)", "xi=0.6 (训练)", "xi=0.6 (测试)")
  )

解决方法

核心是让scale_color_manual和scale_linetype_manual的图例标题、标签内容与类型完全一致,强制ggplot2合并图例:

修正后的代码

library(ggplot2)

set.seed(123)
data <- data.frame(Train = rep(c(20,30,40,50),2), xi = runif(8,0,1), category = c(rep("0.3_val",4),rep("0.3_test",4)))
data <- rbind(data, data.frame(Train = rep(c(20,30,40,50),2), xi = runif(8,0,1), category = c(rep("0.6_val",4),rep("0.6_test",4))))

# 定义统一的表达式标签
legend_labels <- c(
  expression(paste(xi, "=0.3 (训练)")),
  expression(paste(xi, "=0.3 (测试)")),
  expression(paste(xi, "=0.6 (训练)")),
  expression(paste(xi, "=0.6 (测试)"))
)

ggplot(data, aes(x = Train, y = xi, color = category, linetype = category)) +
  geom_line(linewidth = 1) +
  scale_color_manual(
    name = "参数与数据集", # 统一图例标题
    values = c("0.3_val" = "red", "0.3_test" = "blue", "0.6_val" = "darkred", "0.6_test" = "darkblue"),
    labels = legend_labels,
    guide = guide_legend(override.aes = list(linewidth = 1.2)) # 可选:调整图例线条粗细
  ) +
  scale_linetype_manual(
    name = "参数与数据集", # 与color scale的标题完全一致
    values = c("0.3_val" = 1, "0.3_test" = 2, "0.6_val" = 1, "0.6_test" = 2),
    labels = legend_labels # 与color scale的标签完全一致
  ) +
  theme_minimal()

原理说明

ggplot2判断是否合并图例的依据是:两个美学映射(color/linetype)对应的scale是否具有相同的标题、标签内容及类型。只要保证这两个scale的name和labels完全匹配(包括都使用表达式类型),系统就会自动将它们合并为一个图例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:13