
GitHub上有人问,ggbreak单张图都还好,一用grid.arrange拼图就不认。这是因为我们为了兼容ggplot2,所以嘛,它真的完全是个ggplot2,所以除非这些拼图函数内部支持,不然的话,它就被还原成为一个ggplot对象。
比如说:
library(ggplot2)
library(gridExtra)
p = ggplot(mtcars, aes(mpg, disp)) + geom_point()
p + p -> p2
grid.arrange(p2, p)
出图如下:
咦,上面的图,p2不是两张吗?怎么被吃了一张,因为这个用patchwork拼的对象,grid.arrange是不认的,而patchwork是兼容ggplot的,所以被还原为ggplot,剩下一张图。
正确的出图,或者说我们期望的图,应该是:
p2 / p

好了,有了这个铺垫,那么你觉得grid.arrange把ggbreak的效果给吃了,就不足为其了。
有太多的拼图函数了,我们并没有这样的影响力让别人都去支持,那么我们就自己支持嘛,于是这可能也是为什么我需要自己的拼图函数的原因了,aplot::plot_list,我相信你也会喜欢,终究会成为大家的好伙伴。
library(ggbreak)
library(aplot)
library(ggplot2)
set.seed(2019-01-19)
d <- data.frame(
x = 1:20,
y = c(rnorm(5) + 4, rnorm(5) + 20, rnorm(5) + 5, rnorm(5) + 22)
)
p <- ggplot(d, aes(x, y)) + geom_col()
x1 <- p+scale_y_break(c(7, 17 ))
x2 <- x1
x3 <- x1
design <- "
12
13
"
plot_list(x1, x2, x3, design=design)

最后,我还是要告诉你,如果你真的想用grid.arrange以及其它的拼图函数来拼ggbreak的话,是可以的。你只要每张图显式地打印一下,就兼容了。比如下面的代码,就能重复出上面的图。
layout <- rbind(
c(1,2),
c(1,3)
)
grid.arrange(print(x1),
print(x2),
print(x3),
layout_matrix = layout)
这一方法适用于各种情况,比如在《听说你画图存为PDF多了一页白纸》一文中讲到的情况,用ggsave(print(ggbreak))也是可以的,这是另一种解决方案。
