几个月前,我需要删除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。由于版本之间的差距非常大,我不知道可能与此问题有什么关联。
答案 0 :(得分:3)
更新将strip.text.x
或strip.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")