在ggplot中使用scale_colour_manual实现动态名称映射的问题
解决ggplot动态指定图例名称的问题
问题根源
aes()中直接写colour=nam1时,ggplot会将nam1视为数据框的列名,但目标数据框里没有这一列,导致颜色映射失败,线条显示为黑色且无图例。scale_colour_manual里的c(nam1="red")实际创建的是键为字符串"nam1"的向量,而非变量nam1存储的真实名称,无法和映射的颜色值匹配。
解决方案
方法1:用tidyeval语法直接动态赋值
通过!!强制求值环境中的变量,并用setNames创建对应命名的颜色向量:
df <- data.frame(x=c(1,2,3,4,5,6,7,8,9,10), y=c(10,14,13,16,17,14,11,17,19,16), z=c(20,15,13,21,18,16,11,14,17,18)) nam1 <- "Test name 1" nam2 <- "Test name 2" ggplot(df) + geom_line(aes(x, y, colour = !!nam1)) + geom_line(aes(x, z, colour = !!nam2)) + scale_colour_manual( name = "My title", values = setNames(c("red", "blue"), c(nam1, nam2)) )
方法2:转长格式数据(更符合ggplot设计逻辑)
ggplot推荐使用长格式数据,避免重复调用geom_line,代码更简洁易维护:
library(tidyr) library(dplyr) df <- data.frame(x=c(1,2,3,4,5,6,7,8,9,10), y=c(10,14,13,16,17,14,11,17,19,16), z=c(20,15,13,21,18,16,11,14,17,18)) nam1 <- "Test name 1" nam2 <- "Test name 2" # 转长格式并替换分组名称 df_long <- df %>% pivot_longer(cols = c(y, z), names_to = "group", values_to = "value") %>% mutate(group = case_whenSame调配 drawing exposesaddGroup官方 unders Ke```班``` = TRUE ~ nam1, group == "z" ~ nam2 )) ggplot(df_long, aes(x, value, colour = group)) + geom_line() + scale_colour_manual( name = "My title", values = c(!!nam1 := "red", !!nam2 := "blue") )
内容的提问来源于stack exchange,提问作者Phil Smith
相关产品推荐
相关产品推荐

