如何在ggplot的每个分面中添加B组的黑色geom_line?
问题
使用ggplot2按因子c(包含A、B、C三组)分面绘制各组折线图时,希望将B组的黑色折线添加到所有分面中,但尝试的代码仅在B组对应的分面显示这条黑线,需要实现B组黑线在每个分面都显示。
原始代码:
x <- c(seq(1, 10, 1), seq(1, 10, 1), seq(1, 10, 1)) c <- c(rep("A", 10), rep("B", 10), rep("C", 10)) y <- rnorm(30, 0, 1) d <- data.frame(x = x, c = c, y = y) d$c <- as.factor(d$c) library(ggplot2) ggplot() + geom_line(data = d, aes(x = x, y = y, color = c)) + facet_wrap(~c)
尝试的代码:
ggplot() + geom_line(data = d, aes(x = x, y = y, color = c)) + facet_wrap(~c)+ geom_line(data=d[d$c=="B",], aes(x=x,y=y))
解决方案
问题核心是分面变量c会自动过滤后续图层的数据——B组数据的c值为"B",因此仅在对应分面显示。要让B组折线出现在所有分面,需解除该数据的分面变量约束,具体做法是移除B组数据中的c列。
修改后代码(方法一)
# 提取B组数据并删除c列 d_b <- subset(d, c == "B", select = -c) ggplot() + geom_line(data = d, aes(x = x, y = y, color = c)) + facet_wrap(~c) + geom_line(data = d_b, aes(x = x, y = y), color = "black")
修改后代码(方法二,更简洁)
ggplot() + geom_line(data = d, aes(x = x, y = y, color = c)) + facet_wrap(~c) + geom_line( data = transform(subset(d, c == "B"), c = NULL), aes(x = x, y = y), color = "black" )
原理说明
- 使用
facet_wrap(~c)时,ggplot2会对每个图层的数据按c的值自动过滤,仅保留与当前分面匹配的行。 - 移除B组数据的
c列后,该数据不再受分面变量的过滤限制,会在所有分面中渲染。
内容的提问来源于stack exchange,提问作者Hendrik
相关产品推荐
相关产品推荐

