我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上面代码中的行时,每个图都被正确(单独)保存并显示了预期的直方图。
有任何想法吗?
原因是 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)