将ggplots保存到for循环中的列表中

时间:2015-08-05 06:30:33

标签: r ggplot2

我在for循环中生成了9个ggplots,然后使用grid.arrange排列这些图:

plot_list <- list()
for(i in c(3:ncol(bilanz.vol))) {
  histogram <- ggplot(data = bilanz.vol, aes(x = bilanz.vol[,i])) +
  geom_histogram() +
  scale_x_log10() +
  ggtitle(paste(varnames[i]))

  # ggsave(filename = paste("Graphs/", vars[i], ".png", sep = ""), width = 16, height = 12, units = "cm")

  plot_list <- c(plot_list, list(histogram))
}

library(gridExtra)

png(filename = "Graphs/non-mfi.png", width = 1280, height = 960, units = "px")
do.call(grid.arrange, c(plot_list, list(ncol = 3)))
dev.off()

代码本身工作正常,没有错误。但由于某些原因我不明白,网格显示相同(最后)直方图九次。不过,每个情节都显示正确的标题。

有趣的是,当我在上面的代码中取消注释ggsave行时,每个绘图都会正确保存(单独)并显示预期的直方图。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

原因是ggplot在使用之前没有评估aes调用中的表达式(所以我至少相信),它只是设置了图并将数据存储在其中。在您的情况下,“数据”是整个数据框bilanz.vol,并且在i = ncol(bilanz.vol)循环完成后for表达式bilanz.vol[,i]将为所有绘图对象评估相同的内容

要使其工作,您可以执行此操作,这可确保所有绘图对象包含不同的数据集my.data

my.data <- data.frame(x = bilanz.vol[,i])
histogram <- ggplot(data = my.data, aes(x = x)) +
    geom_histogram() +
    scale_x_log10() +
    ggtitle(paste(varnames[i]))