【问题标题】:Plot multiple ggplot2 on same page在同一页面上绘制多个 ggplot2
【发布时间】:2016-01-20 08:56:48
【问题描述】:

我有一个工作循环,它可以从目录中保存的每个文件中生成并保存单独的图。

我想在一个文件中将所有返回的图绘制为多个页面上的 2x2 网格,但不能这样做。

我已尝试将绘图对象保存在列表中

pltList <- list()
pltList[]

for (f in 1:length(files)){
plot_object <- ggplot2(...)  #make ggplot2 plot
print(plot_object)
pltList[[f]] <- plot_object  #save ggplot2 plot in list
}

jpeg(filename.jpg)
par(mfrow=c(2,2))  #to generate 2x2 plot per page
print(pltList[[1]])
print(pltList[[2]])
...
print(pltList[[f]])
dev.off()

问题是生成的保存的 .jpg 文件只包含最后一个图,而不是我想要的多页上所有图的 2x2 网格。

编辑

我的第一个问题是如何从列表中的循环中保存每个图 - 我如何查看列表中保存的对象以确保它们已正确保存? 当我执行print(pltList[1]) 时,结果输出为:

function (x, y, ...) 
UseMethod("plot")
<bytecode: 0x0000000010f43b78>
<environment: namespace:graphics>

而不是实际情节。似乎这些图没有按预期保存在列表中。我该如何纠正这个? 希望一旦解决此问题,您的绘图建议将起作用。

【问题讨论】:

标签: r loops plot ggplot2


【解决方案1】:

我最近也这样做了。我用grid.arrange()

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

p1<-ggplot()+geom_line(aes(x=1:10,y=1:10))
p2<-ggplot()+geom_line(aes(x=1:10,y=1:10))
p3<-ggplot()+geom_line(aes(x=1:10,y=1:10)) 
p4<-ggplot()+geom_line(aes(x=1:10,y=1:10))
grid.arrange(p1,p2,p3,p4, ncol=1, top=textGrob("Multiple Plots", gp=gpar(fontsize=12, font = 2)))

【讨论】:

  • 如果图在列表中do.call(grid.arrange, c(pltList, ncol=2))
【解决方案2】:

假设您需要一个 PDF 输出,其中每一页都有多个绘图作为一个绘图,例如:如果有 12 个绘图,则每页 4 个绘图。

试试这个例子:

library(ggplot2)
library(cowplot)

# list of 12 dummy plots, only title is changing.
pltList <- lapply(1:12, function(i){
  ggplot(mtcars,aes(mpg,cyl)) +
    geom_point() +
    ggtitle(paste("Title",i))})

# outputs 3 jpeg files with 4 plots each.
for(i in seq(1,12,4))
ggsave(paste0("Temp",i,".jpeg"),
       plot_grid(pltList[[i]],
                 pltList[[i+1]],
                 pltList[[i+2]],
                 pltList[[i+3]],nrow = 2))

# or we can output into 1 PDF with 3 pages using print
pdf("TempPDF.pdf")
for(i in seq(1,12,4))
  print(plot_grid(pltList[[i]],
            pltList[[i+1]],
            pltList[[i+2]],
            pltList[[i+3]],nrow = 2))
dev.off()

编辑:

@user20650 建议的另一种使用 gridExtra 的方法:

library(gridExtra)

#output as PDF
pdf("multipage.pdf")

#use gridExtra to put plots together
marrangeGrob(pltList, nrow=2, ncol=2)

dev.off()

【讨论】:

  • 好,但我需要将所有 3 页保存在一个文件中
  • @Bob 查看编辑,我们不能有 JPEG 格式的页面,也许您需要 PDF?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多