在页面上布置多个 ggplot 图

Posted

技术标签:

【中文标题】在页面上布置多个 ggplot 图【英文标题】:Lay out multiple ggplot graphs on a page 【发布时间】:2020-01-27 04:10:56 【问题描述】:

我在循环中生成一个 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")

根据数据集,myPlots 中可能有 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 中的所有图打印成两行。

提前致谢

托马斯·飞利浦

【问题讨论】:

【参考方案1】:

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

ggarrange(plotlist = myPlots, nrow = 2)

【讨论】:

【参考方案2】:

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

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

【讨论】:

你可能想要nrow = 2,而不是ncol,来解决这个问题【参考方案3】:

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))

【讨论】:

【参考方案4】:

你可以使用 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)

【讨论】:

哈利路亚 - 就像一个魅力!我没有想到我必须明确设置 plotlist = myPlots 并声明 nrow 和 ncol。我一写ggarrange(plotlist = myPlots, nrow = 2, ncol = ceiling(length(myPlots)/2)),就得到了我想要的东西。感谢工厂的快速响应!!! 没问题。您介意批准答案并投票吗?谢谢 完成!。最后一个问题。当我在 RStudio 的控制台中键入 ggarrange(plotlist = myPlots, nrow = 2, ncol = ceiling(length(myPlots)/2)) 时,我得到了我期望的 8 个图表。但是,如果我 Source 整个脚本,则不会抛出任何数字。更令人困惑的是,如果我将光标放在线上并单击运行,我会得到绘图。是否需要执行其他命令才能在我获取脚本时显示? 这可能是设备(绘图窗口)的问题。确保使用 dev.off() 关闭所有设备 我用 dev.off() 启动脚本 ``` rm(list = ls(all = TRUE)) #清除工作区中的所有对象 if(!is.null(dev.list( )["RStudioGD"])) dev.off() #清除所有图形```但无法显示garrange的结果。当我自己运行这条线时,我第一次收到警告:```警告消息:在doTryCatch(return(expr),name,parentenv,handler)中:显示列表重绘不完整```这会响铃吗?

以上是关于在页面上布置多个 ggplot 图的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2:从列表和常见图例中在多个页面上绘制图形

ggplot2一页多图排版的简便方法

for循环中的多个图忽略par

将百分比标签添加到堆积条形图ggplot2

ggplot2中的多个图

安排多个ggplots,但避免由于轴标签而挤压