gpt4 book ai didi

r - 从ggplot2图表中删除图层

转载 作者:行者123 更新时间:2023-12-03 09:22:01 25 4
gpt4 key购买 nike

我想从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的答案,因为它起作用。现在,我需要确定如何动态访问 geom_ribbon层,这是在SO问题 here中捕获的。

编辑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.x.y)

最佳答案

对于ggplot2 2.2.1版,我必须像这样修改建议的remove_geom函数:

remove_geom <- function(ggplot2_object, geom_type) {
# Delete layers that match the requested type.
layers <- lapply(ggplot2_object$layers, function(x) {
if (class(x$geom)[1] == geom_type) {
NULL
} else {
x
}
})
# Delete the unwanted layers.
layers <- layers[!sapply(layers, is.null)]
ggplot2_object$layers <- layers
ggplot2_object
}

以下是使用方法的示例:
library(ggplot2)

set.seed(3000)
d <- data.frame(
x = runif(10),
y = runif(10),
label = sprintf("label%s", 1:10)
)

p <- ggplot(d, aes(x, y, label = label)) + geom_point() + geom_text()

让我们显示原始图:
p

plot with text labels

现在,让我们删除标签并再次显示图:
p <- remove_geom(p, "GeomText")
p

plot without text labels

关于r - 从ggplot2图表中删除图层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13407236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com