2017-04-19 156 views
1

我想要在多個頁面上安排使用以下layout_matrix的圖。在多個頁面上使用grid.arrange或使用layout_matrix marrangeGrob

enter image description here

代表。例如

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) 

請幫我一般解決方案在多個頁面上有一個layout_matrix。

回答

3

這似乎工作,

marrangeGrob(grobs=p, nrow=1, ncol=5, layout_matrix=layout) 

(誠然,一個偶然的機會)

marrangeGrob只是圍繞一個瘦包裝的循環和grid.arrange,所以如果你需要的東西比這更精緻幸運的解決方法,你應該修改代碼來滿足你的需求。

+0

不知怎的,完美的作品在這種情況下。感謝分享 –

+0

使用包含NA字段的幾種不同和更復雜的佈局測試它。一直工作!這是一個真正的解決方案。 –

0

做了我自己的功能,這使得多個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) 
相關問題