我想在多个页面上安排以下layout_matrix的绘图。
library(gridExtra)
library(ggplot2)
layout <- rbind(c(1,2,3,4),
c(1,2,3,4),
c(1,2,3,4),
c(5,5,5,5))
p <- list()
for(i in 1:15) {
ifelse(i %% 5 > 0,
p[[i]] <- ggplot(mtcars, aes(wt, mpg)) + geom_point() + ggtitle(paste("plot:",i)),
p[[i]] <- tableGrob(mtcars[5:7,],rows = NULL)
)
}
如果我只有一页:(简单)
grid.arrange(grobs=p[1:5],layout_matrix=layout)
如果我想要多个页面:(我放弃了所有模式)
marrangeGrob(grobs=p,nrow=4,ncol=2)
答案 0 :(得分:5)
这似乎有效,
marrangeGrob(grobs=p, nrow=1, ncol=5, layout_matrix=layout)
(诚然,偶然)
marrangeGrob
只是围绕for循环和grid.arrange的一个薄包装器,因此如果您需要比这个幸运的解决方案更精致的东西,您应该根据需要修改代码。
答案 1 :(得分:1)
创建我自己的函数,使多个grid.arrange
文件具有布局,然后将marrangeGrob
文件放入多页对象中。
m.grid.arrange <- function(p,topnames,layMat) {
pdf(file = NULL) #invisible
plotsPerPage <- length(unique(na.omit(c(layMat))))
ml <- lapply(1:ceiling(length(p)/plotsPerPage), function(page_IND){
ind <- (1+((page_IND-1)*plotsPerPage)):(page_IND*plotsPerPage)
grid.arrange(grobs = p[ind], layout_matrix = layMat,top=topnames[page_IND])
})
return(marrangeGrob(grobs=ml,nrow=1,ncol=1,top=NULL))
dev.off() #invisible
}
然后使用:
ml <- m.grid.arrange(p=p,topnames=c("1 label","2 label","3 label"),layMat = layout)
ggsave("gridMeHard.pdf",width = 297, height = 210, units = "mm", ml)