作为从已经创建的绘图中删除特定几何图形(SO链接here)的一部分,我想动态确定ggplot2对象每一层的几何图形类型。

假设我不知道添加图层的顺序,是否有办法动态查找具有特定几何图形的图层?如果像下面一样打印出图层,我可以看到图层存储在列表中,但是似乎无法访问geom类型。

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()
p$layers

[[1]]
mapping: ymin = ymin, ymax = ymax
geom_ribbon: na.rm = FALSE, alpha = 0.3
stat_identity:
position_identity: (width = NULL, height = NULL)

[[2]]
geom_line:
stat_identity:
position_identity: (width = NULL, height = NULL)

我对原型(prototype)对象不熟悉,我从原型(prototype)documentation尝试过的东西似乎不起作用(例如p$layers[[1]]$str())。

由于下面的答案,我得以提出一个动态删除图层的函数:
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
}

最佳答案

ggplot 2.2更新:
如果您想要的是命名geom类型的字符串,则可以使用:

sapply(p$layers, function(x) class(x$geom)[1])

这将为每一层的geom对象生成第一类名称。在OP的示例中:
[1] "GeomRibbon" "GeomLine"

上面答案中的代码不再提供版本2.2的结果。接受的答案产生两个NULL值,另一个答案产生完整的ggproto对象。

关于r - 如何确定ggplot2对象每一层的几何类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13457562/

10-11 07:25