在一个轴上删除strip.background:没有图层

时间:2015-10-14 16:37:23

标签: r ggplot2 gridextra

几个月前,我需要删除ggplot2刻面图中生成的一个条带。我发现有人已经在this question询问了,答案很顺利:

library(ggplot2)
a <- ggplot(mtcars, aes(mpg, hp)) +
  geom_point() +
  facet_grid(cyl~gear) 

strip.remover <- function(ggp, what="x") {
  require(gridExtra)

  zeroGrob <- function() {
    g0 <- grob(name="NULL")
    class(g0) <- c("zeroGrob",class(g0))
    g0
  }

  g <- ggplotGrob(ggp)

  g$grobs <- lapply(g$grob, function(gr) {
    if (any(grepl(paste0("strip.text.", what),names(gr$children)))) {
      gr$children[[grep("strip.background",names(gr$children))]] <- zeroGrob()
      gr$children[[grep("strip.text",names(gr$children))]] <- zeroGrob()
    }
    return(gr)
  }
  )

  class(g) = c("arrange", "ggplot",class(g)) 
  g
}

strip.remover(a, "y")

今天,我试图重新生成一些使用此代码的数字,但这并不令我惊讶。显然,使用ggplotGrob创建一个grob,修改其内容并将其转换回ggplot2对象不再起作用。

我对如何继续这里感到有点无能为力。关于为什么这段代码不再起作用的任何想法?

我怀疑包gridExtra可能是罪魁祸首。在我的工作机器中,这个代码可以运行,这个软件包的版本是0.9.1,但是在我的笔记本电脑中,它不能正常工作,我有2.0.0。由于版本之间的差距非常大,我不知道可能与此问题有什么关联。

1 个答案:

答案 0 :(得分:3)

更新strip.text.xstrip.text.y设置为element_blank()会完全删除该条带。

library(ggplot2)

a <- ggplot(mtcars, aes(mpg, hp)) +
  geom_point() +
  facet_grid(cyl~gear)

a + theme(strip.text.y = element_blank())

<强>原始 需要注意的一点是:ggplot grobs无法转换回ggplot2对象。但是ggplot grobs可以表现得有点像ggplot2对象。

另一点:在您提供的链接中,查看Baptiste解决方案的解决方案列表。它更少依赖于ggplot grob的结构。

library(ggplot2)

a <- ggplot(mtcars, aes(mpg, hp)) +
  geom_point() +
  facet_grid(cyl~gear) 

library(grid)

# To remove the strip but keep the space
g <- ggplotGrob(a)
keep <- !grepl("strip-r", g$layout$name)
g$grobs <- g$grobs[keep]
g$layout <- g$layout[keep, ]
grid.newpage()
grid.draw(g)

# To remove the strip and the space
g = g[, -which(!keep)]
grid.newpage()
grid.draw(g)

使grob的行为更像ggplot对象:

#  A print method for the plot
print.ggplotgrob <- function(x) {
   grid.newpage()   
   grid.draw(x)
}
class(g) = c("ggplotgrob", class(g)) 

g
ggsave("plotGrob.png", g)

OR 将其包含在函数中:

strip.remover = function(plot, strip) {
    g <- ggplotGrob(plot); dev.off()
    if(!(strip == "t" | strip == "r") )  stop("strip must be either 't' or 'r'")

    keep <- !grepl(paste0("strip-", strip), g$layout$name)
    g$grobs <- g$grobs[keep]
    g$layout <- g$layout[keep, ]

    class(g) <- c("ggplotgrob",  class(g)) 
    g
}

#  A print method for the plot
print.ggplotgrob <- function(x) {
    library(grid)
    grid.newpage()   
    grid.draw(x)
    }


# Try it out
gtplot <- strip.remover(a, "t")
gtplot
ggsave("grob.png", gtplot)

strip.remover(a, "r")
strip.remover(a, "wrong")