我想从 ggplot2 创建的网格对象中删除一个layer
(在这种情况下是 的结果)。geom_ribbon
一旦它已经是对象的一部分,有没有办法可以将其删除?
library(ggplot2)
dat <- data.frame(x=1:3, y=1:3, ymin=0:2, ymax=2:4)
p <- ggplot(dat, aes(x=x, y=y)) + geom_ribbon(aes(ymin=ymin, ymax=ymax), alpha=0.3)
+ geom_line()
# This has the geom_ribbon
p
# This overlays another ribbon on top
p + geom_ribbon(aes(ymin=ymin, ymax=ymax, fill=NA))
我希望这个功能允许我在不太复杂的情节之上构建更复杂的情节。我正在使用返回网格对象的函数,然后在完全组装后打印出最终图。基图有一条线,geom_ribbon
周围有一个相应的误差线 ( )。更复杂的情节将有几条线,并且多个重叠的geom_ribbon
对象会分散注意力。我想将它们从多行的图中删除。此外,我将能够使用构面或其他 ggplot2 功能快速创建替代版本。
编辑:接受@mnel's answer as it works。现在我需要确定如何动态访问该geom_ribbon
层,这在此处的 SO 问题中被捕获。
编辑2:为了完整起见,这是我为解决这个问题而创建的函数:
remove_geom <- function(ggplot2_object, geom_type) {
layers <- lapply(ggplot2_object$layers, function(x) if(x$geom$objname == geom_type) NULL else x)
layers <- layers[!sapply(layers, is.null)]
ggplot2_object$layers <- layers
ggplot2_object
}
编辑 3:有关最新版本的 ggplot (>=2.xy),请参阅下面接受的答案