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

为何我的reprex中R函数无法显示ggplot图例?

问题原因与解决方法

核心问题

图例无法显示的原因有两个:

  1. geom_line的colour参数未正确建立映射关系:直接在aes()中写colour=ynam1时,ggplot会将ynam1当作数据框的列名去查找,但你的意图是把它作为图例的标签文本而非列名,导致ggplot无法识别这是需要生成图例的映射。
  2. scale_colour_manual的颜色映射键错误:values=c(ynam1="red", ynam2="blue")里的键是变量名ynam1/ynam2,而非它们的实际字符串值(比如"L1"/"L2"),导致颜色映射无法匹配图例项。

修改后的代码

library(tidyverse)
MkChrt <- function(df,x_col1,y_col1,x_col2,y_col2,ynam1,ynam2,legName,titl) {
  c0 <- ggplot(df)+
    # 用!!将字符串参数注入aes,建立colour的映射关系
    geom_line(aes(x={{x_col1}}, y={{y_col1}}, colour=!!ynam1), linewidth=1.2)+
    geom_line(aes(x={{x_col2}}, y={{y_col2}}, colour=!!ynam2), linewidth=1.2)+
    labs(title=titl, x="", y="") +
    # 用setNames生成对应标签的颜色映射
    scale_colour_manual(name=legName, values=setNames(c("red", "blue"), c(ynam1, ynam2)))+
    theme(legend.position=c(0.25,0.85),
          legend.key=element_rect(fill="transparent"),
          legend.background=element_rect(fill="transparent"),
          legend.text=element_text(size=14),
          legend.title=element_text(size=16))+
    NULL
  return(c0)
}

LP <- data.frame(Date=seq.Date(as.Date("2023-01-01"),as.Date("2023-10-01"),
                               by="quarter"),L1=c(90,92,95,91),L2=c(50,54,59,61))
c0 <- MkChrt(LP,Date,L1,Date,L2,
             "L1","L2","Legend for L1 and L2",
             "Labour productivity"
)
c0

关键修改说明

  • !!ynam1:!!是tidyeval语法,用于将传入的字符串参数(比如"L1")直接注入到aes()中,让ggplot将其识别为colour映射的一个水平,从而生成对应的图例项。
  • setNames(c("red", "blue"), c(ynam1, ynam2)):动态生成命名向量,确保颜色值和传入的图例标签(ynam1/ynam2的实际值)一一对应,让scale_colour_manual能正确匹配颜色和图例项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:23:09