我在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
行时,每个绘图都会正确保存(单独)并显示预期的直方图。
有什么想法吗?
答案 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]))