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.arrangeggbreak的效果给吃了,就不足为其了。

有太多的拼图函数了,我们并没有这样的影响力让别人都去支持,那么我们就自己支持嘛,于是这可能也是为什么我需要自己的拼图函数的原因了,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))也是可以的,这是另一种解决方案。