为何我的reprex中R函数无法显示ggplot图例?
问题原因与解决方法
核心问题
图例无法显示的原因有两个:
geom_line的colour参数未正确建立映射关系:直接在aes()中写colour=ynam1时,ggplot会将ynam1当作数据框的列名去查找,但你的意图是把它作为图例的标签文本而非列名,导致ggplot无法识别这是需要生成图例的映射。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
相关产品推荐
相关产品推荐

