ggplot图例颜色正常但geom_line曲线显示为灰色该如何修复?
问题原因
- 核心错误是
scale_color_manual()中设置的分类名称和数据中transformation列的实际取值不匹配,少了末尾的点号:
数据里的真实分类取值为log.x.、log10.x.,你在配置颜色时写的是log.x、log10.x,名称不匹配导致ggplot无法给对应分类赋值自定义颜色。 - 名称匹配失败时,ggplot会将未匹配到的分类默认渲染为灰色,你代码里因为填了两个不存在的分类名,挤占了有效配置位,导致
e.x、ten.x最终未被正确分配到设置的颜色。 - 额外冗余问题:你提前生成了因子类型的
name列,但绘图时没有用到,实际映射颜色用的还是原始字符型的transformation列。
修复方案
直接修正scale_color_manual里的键名即可,修正后完整代码如下:
Xp <- 1:20/5 X <- -10:10/5 X10 <- -10:5/5 df <- data.frame( x = Xp, log2.x. = log2(Xp), log.x. = log(Xp), log10.x. = log10(Xp)) %>% full_join(data.frame( x = X, two.x = 2 ** X, e.x = exp(X))) %>% full_join(data.frame( x = X10, ten.x = 10 ** X10)) %>% pivot_longer(cols = -c(x), names_to = "transformation") %>% mutate(name = factor(transformation, levels = unique(transformation))) df %>% ggplot(aes(x=x, y=value, color=transformation)) + geom_line() + scale_color_manual(values = c( "log2.x." = "red", "log.x." = "green", # 补上末尾的点,和实际分类名一致 "log10.x." = "blue", # 补上末尾的点,和实际分类名一致 "two.x" = "red", "e.x" = "green", "ten.x" = "blue"))
如果要避免后续匹配错误,也可以把颜色映射改为color=name,直接使用提前生成的因子列即可。
内容的提问来源于stack exchange,提问作者Steven Bhardwaj
相关产品推荐
相关产品推荐

