在ggplot2中让一个面板变为空白

9
p <- ggplot(mtcars, aes(mpg, wt)) 
p + geom_point()+facet_grid(cyl ~ vs)+theme_bw()

图片

我希望在不显示任何数据点的情况下使面板(右下角的1 vs 8)变空白,但同时仍想保留这种布局。

因此,facet_wrap(cyl ~ vs) 不能解决我的问题。

也许更一般的问题是是否可以在ggplot2中安排每个面板?


我之前放弃了在ggplot中尝试做这件事,使用普通的绘图命令很简单。另外,你可以尝试将此发送到ggplot邮件列表。 - Jeremy Miles
但是,如果您使用 facet_wrap(cyl ~ vs, ncol=2),则排列方式将得到保留,尽管标签会稍微改变。这不是您的意图吗? - Nick
2个回答

18
你可以这样做,但据我所知不能使用facet_wrap。创建独立的子图。如需详细的逐步方法,请查看我的答案
创建一个空白的绘图,使用gridExtra包组合绘图:
library(gridExtra)
library(grid)

blank <- grid.rect(gp=gpar(col="white"))

grid.arrange(plot1, plot2, blank, plot3, ncol=2)

这种方法还可以让你对最终图的外观产生很大影响(在我看来)。


@joaoal 不是这样的;grid.arrangegridExtra包中的一个函数。 - Jaap
@Jaap 但是 grid.rect 需要 library("grid") - Rufo
这对我没有用,绘图前出现了一个巨大的空白空间... - halo09876

11
您可以更改表格的 grobs。
## get the table grobs
g1 <- ggplot_gtable(ggplot_build(p))

library(gtable)
library(grid)
## here the main modification
## change one panel by a new rectangle.
pp <- gtable_add_grob(g1,rectGrob(gp=gpar(col=NA)),t=8,l=6,b=8,r=6)
grid.draw(pp)

enter image description here


5
g = ggplotGrob(p); g$grobs[[max(which(g$layout$name == "panel"))]] = nullGrob(); grid.draw(g)这段代码的作用是使用ggplot2包中的函数ggplotGrob()将图形对象p转换为一个绘图表格对象g,然后找到该表格对象中“panel”名字对应的最后一个组件,并将其替换为nullGrob(),最后使用grid包中的函数grid.draw()将修改后的表格对象g绘制出来。 - baptiste
@agstudy,非常感谢你,这正是我想要的。 - user36102

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接