假设在一个循环中,我得到了一组特定的图,我将其保存在一个图列表中,就像我的可重复示例一样.

plot_list = list()

for (i in 1:5){

dummy1 = ggplot(iris, aes(x = Petal.Length)) +
  geom_histogram()

dummy2 = ggplot(iris, aes(x = Petal.Length, color=Species)) +
  geom_boxplot()

dummy3 = ggplot(iris, aes(x = Petal.Length, y=Petal.Width, color=Species)) +
  geom_point()

plot_list[[length(plot_list)+1]] = list(dummy1,dummy2,dummy3) 

}

在迭代之后,一旦我准备好了绘图列表,我想创建一个单独的PDF页面,每个页面都传递一个特定的布局矩阵.在不同的帖子中,我try 了这段代码:

lay = rbind (c(1,1,2,2),
             c(1,1,3,3),
             c(1,1,3,3))


grDevices::cairo_pdf("plots.pdf", onefile = TRUE)
for (i in seq(length(plot_list))) {
  do.call('marrangeGrob',list(plot_list[[i]], layout_matrix=lay))  
}
dev.off()

遗憾的是,它只返回单页的空白pdf.如有任何帮助,我们不胜感激.

更新:非常重要的是,我的示例是一个可重现的示例,但其 struct 不能修改.它来自for的原因是因为在我的原始代码中来自foreach,所以答案需要与我提出的 struct 兼容.

推荐答案

要绘制ggplot‘S或其他网格图形,则需要显式打印:使用grid::grid.draw(参见FAQ 7.22).

此外,使用marrangeGrob可以添加额外的NewPage;遗憾的是,this fix在开头有一个空页面,但this仍然有效. 或者你可以把marrangeGrob转到pdf之外...如果这符合我们的工作流程.

library(ggplot2)
library(gridExtra)
library(grid)

# Baptiste's fix
# if your example in your question represents your real example then you 
# could use `arrangeGrob` and avoid some of the newpage tweaks
grid.draw.arrangelist <- function(x, ...) {
  for(ii in seq_along(x)){
    if(ii>1) grid.newpage() 
     grid.draw(x[[ii]])
}
}

# Output plot
grDevices::cairo_pdf("plots.pdf", onefile = TRUE)

for (i in seq_along(plot_list)) {
  
  p <- marrangeGrob(grobs=plot_list[[i]], 
                    layout_matrix=lay, 
                    top = quote(paste("page", i, "of", length(plot_list))))
  grid::grid.draw(p) # need to be explicitly drawn 
  
  if(i < length(plot_list)) grid.newpage() # so plots are not drawn over each other
}

dev.off()

R相关问答推荐

如何在四进制仪表板值框中显示值(使用shiny 的服务器计算)

根据列表中项目的名称多次合并数据框和列表

无法将传奇添加到cowplot多情节中

根据模式将一列拆分为多列,并在R中进行拆分

gganimate在使用shadow_mark选项时不保留所有过go 的标记

将嵌套列表子集化为嵌套列表

单个轮廓重叠条的单独图例

在R中为马赛克图中的每个字段着色

制作等距离的线串副本

在RStudio中堆叠条形图和折线图

随机森林的带Shap值的蜂群图

从数据创建数字的命名列表.R中的框

如何提取R中其他字符串和数字之间的字符串?

为什么函数toTitleCase不能处理english(1),而toupper可以?

如何构建一个for循环来循环处理动物ID?

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值

按镜像列值自定义行顺序

如果满足条件,则替换列的前一个值和后续值

如何捕获这个shiny 的、可扩展的react 性用户输入矩阵作为另一个react 性对象,以便进一步操作?

Ggplot2:添加更多特定 colored颜色 的线条