ggplot2绘图疑问:show.legend=FALSE仍出现多余图例及颜色异常
问题原因分析
1. 图例出现"A.line"/"B.line"的原因
ggplot的colour美学映射基于全局颜色比例尺,哪怕给geom_line加了show.legend=FALSE,它的colour=names.lines仍会把"A.line"和"B.line"这两个类别加入颜色比例尺的候选集合,最终图例会包含所有被colour映射过的类别——不管是点还是线条的。
2. 图例出现四种颜色的原因
你的数据里names.points有"A.point"/"B.point"两个类别,names.lines有"A.line"/"B.line"两个类别,四个完全不同的类别会被ggplot默认分配四种不同颜色,这就是你看到四种颜色的原因。
解决方案:统一颜色映射逻辑
要实现图例只显示"A.point"/"B.point",且线条和点颜色一致,核心是让线条和点的colour映射使用相同的类别名称,或手动绑定颜色对应关系。这里推荐两种简洁方法:
方法1:调整数据字段,统一类别名称
直接把names.lines的名称改成和names.points一致,让两者共享同一个颜色比例尺,再配合show.legend=FALSE让线条不生成图例项:
library(ggplot2) library(dplyr) data.frame(x = rep(1:2,2), names.points = rep(c("A.point","B.point"), 2), y.point = c(2, 4, 7, 9), names.lines = rep(c("A.point","B.point"), each = 2), # 修改为和点一致的名称 y.line = c(3, 3, 8, 8)) %>% ggplot() + geom_point(aes(x = x, y = y.point, colour = names.points), size = 5) + # colour自动分组,可省略group参数 geom_line(aes(x = x, y = y.line, colour = names.lines), show.legend = FALSE)
方法2:手动指定颜色比例尺,绑定线条与点的颜色
如果不想修改原始数据,可通过scale_colour_manual手动指定每个类别的颜色,同时用breaks参数只保留点的类别在图例中:
library(ggplot2) library(dplyr) data.frame(x = rep(1:2,2), names.points = rep(c("A.point","B.point"), 2), y.point = c(2, 4, 7, 9), names.lines = rep(c("A.line","B.line"), each = 2), y.line = c(3, 3, 8, 8)) %>% ggplot() + geom_point(aes(x = x, y = y.point, colour = names.points), size = 5) + geom_line(aes(x = x, y = y.line, colour = names.lines), show.legend = FALSE) + scale_colour_manual( values = c( "A.point" = "#F8766D", # 给A系列指定颜色 "B.point" = "#00BFC4", "A.line" = "#F8766D", # 让A.line和A.point同色 "B.line" = "#00BFC4" # 让B.line和B.point同色 ), breaks = c("A.point", "B.point") # 仅显示点的类别在图例 )
两种方法都能达成需求:图例仅展示点的类别,且线条和对应点颜色完全一致。
内容的提问来源于stack exchange,提问作者David R
相关产品推荐
相关产品推荐

