首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从ggplot2图表中删除图层

从ggplot2图表中删除图层
EN

Stack Overflow用户
提问于 2012-11-16 06:18:30
回答 5查看 7.9K关注 0票数 34

我想从ggplot2创建的网格对象中删除一个layer (在本例中是geom_ribbon的结果)。一旦它已经是对象的一部分,有没有方法可以删除它?

代码语言:javascript
复制
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对象会分散注意力。我想将它们从具有多条线的图中删除。此外,我还可以使用facet或其他ggplot2功能快速创建替代版本。

编辑:在工作时接受@mnel的答案。现在,我需要确定如何动态访问在SO问题here中捕获的geom_ribbon层。

编辑2:为了完整性,这是我为解决这个问题而创建的函数:

代码语言:javascript
复制
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),请参阅下面的公认答案

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-09-14 21:55:14

对于ggplot2版本2.2.1,我必须修改建议的remove_geom函数,如下所示:

代码语言:javascript
复制
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
}

下面是一个如何使用它的示例:

代码语言:javascript
复制
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()

让我们来看一下原始的图:

代码语言:javascript
复制
p

现在,让我们删除标签并再次显示绘图:

代码语言:javascript
复制
p <- remove_geom(p, "GeomText")
p

票数 21
EN

Stack Overflow用户

发布于 2012-11-16 06:31:52

如果你看一下

代码语言:javascript
复制
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)

您将看到您想要移除第一层

您可以通过将层重新定义为列表中的第二个组件来执行此操作。

代码语言:javascript
复制
p$layer <- p$layer[2]

现在构建并绘制p

代码语言:javascript
复制
p

请注意,p$layer[[1]] <- NULL也可以工作。我同意@Andrie和@Joran关于在我们的情况下这可能是有用的评论,并且不期望这一定是可靠的。

票数 21
EN

Stack Overflow用户

发布于 2017-10-06 01:08:02

由于这个问题看起来很有趣,我扩展了我的'ggpmisc‘包,增加了一些函数来操作ggplot对象中的层(目前在包’gginnards‘中)。这些函数是我之前对这个问题的回答中示例的更精致的版本。但是,请注意,在大多数情况下,这不是最好的工作方式,因为它违反了图形语法。在大多数情况下,人们可以使用operator +以正常的方式组装同一图形的不同变体,可能会将层组“打包”到列表中,以具有组合的构建块,从而简化复杂图形的组装。在例外情况下,我们可能想要编辑现有的绘图或由不能修改其定义的更高级别函数输出的绘图。在这种情况下,这些层操作函数可能很有用。上面的例子变成了。

代码语言:javascript
复制
library(gginnards)
p1 <- delete_layers(p, match_type = "GeomText")

请参阅该软件包的文档以获取其他示例,以及有关用于修改层的顺序和在任意位置插入新层的伴生函数的信息。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13407236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档