在页面上布置多个ggplot图

时间:2019-09-26 20:27:05

标签: r ggplot2 ggpubr

我在循环内生成ggplot对象的列表,如下所示:

myPlots = list()
for(i in 1:length(maturities)){
  myPlots[[i]] <- ggplot(deltaIR.df, aes(sample = deltaIR.df[,i])) + 
                  stat_qq() + stat_qq_line() + 
                  labs(title=maturities[i],
                  x = "Theoretical (Normal)", 
                  y = "Empirical Distribution")
}

取决于数据集,myPlot中可能有4至10个图。我现在想将它们打印在一页上的两行中,并尝试了各种方法,但均获得了不同程度的成功。最有前途的方法是

library(ggpubr)
grid.arrange(myPlots[[1]], myPlots[[2]], myPlots[[3]], myPlots[[4]], 
             myPlots[[5]], myPlots[[6]], myPlots[[7]], myPlots[[8]], nrow = 2)

这显然是可行的,但需要我枚举所有对象,而且我不知道会有多少个对象。我试图通过写来简化

ggarrange(myPlots, nrow = 2)

但收到警告消息:

Warning message:
In as_grob.default(plot) : Cannot convert object of class list into a grob.

我做错了什么,该如何解决?理想情况下,简单,一行代码即可将存储在myPlots中的所有图打印成两行。

预先感谢

托马斯·菲利普斯

4 个答案:

答案 0 :(得分:2)

您可以使用cowplot :: plot_grid来获取它。

以下是带有伪造数据的示例:

##List with ten datasets
set.seed(3)
l <- lapply(1:10, function(i)tibble(
  letter = letters,
  values = rnorm(26)
))

##List of ten different plots
plot_list_1 <- lapply(l, function(i)i %>% ggplot(aes(x = values)) + geom_density())

##Display ten plots
cowplot::plot_grid(plotlist = plot_list_1,nrow = 2)

##Display four plots
cowplot::plot_grid(plotlist = plot_list_1[1:4],nrow = 2)

enter image description here

enter image description here

答案 1 :(得分:1)

ggpubr::ggarrange只是cowplot::plot_grid()的包装。

但是,如果您想呆在ggpubr上,则可以继续使用ggarrange。并且您需要将所有图解保存在列表中,并使用plotlist参数。

library(ggpubr)
library(ggplot2)
library(purrr)

myplot <- function(color){
    ggplot(iris,aes(x = Sepal.Length, y = Sepal.Width)) + geom_point(color = color)
}
plot_list <- map(c("red","green","blue","black","orange"),myplot)


ggarrange(plotlist = plot_list,nrow = 2,ncol = ceiling(length(plot_list)/2))

enter image description here

答案 2 :(得分:0)

这对我有用,它类似于您已经使用的代码。

library(gridExtra)    
grid.arrange(grobs=myPlots, nrow=2)

答案 3 :(得分:0)

只需在“myPlots”之前添加“plotlist”即可声明 myPlots 是一个列表,如文档所述

ggarrange(plotlist = myPlots, nrow = 2)