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

der*_*und 7 r ggplot2

ggplots在 for 循环中生成 9 个,然后使用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()
Run Code Online (Sandbox Code Playgroud)

代码本身运行良好,没有错误。但由于某种原因我不明白,网格显示相同的(最后一个)直方图九次。尽管如此,每个图都显示了正确的标题。

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

有任何想法吗?

Bac*_*lin 6

原因是 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]))
Run Code Online (Sandbox Code Playgroud)