der_grund
der_grund

Reputation: 1938

Saving ggplots to a list in a for loop

I produce nine ggplots within a for loop and subsequently arrange those plots using 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()

The code itself works fine and there are no errors. But for some reason I do not understand, the grid shows the same (last) histogram nine times. Still, each plot shows the correct title.

Interestingly, when I uncomment the ggsave line in the code above, each plot is saved correctly (separately) and shows the expected histogram.

Any ideas?

Upvotes: 7

Views: 6572

Answers (1)

Backlin
Backlin

Reputation: 14842

The reason is that ggplot does not evaluate the expression in the aes call before it is used (so I believe at least), it just sets up the plot and stores the data inside of it. In you case "the data" is the entire data frame bilanz.vol and since i = ncol(bilanz.vol) after the for loop completes the expression bilanz.vol[,i] will evaluate to the same thing for all plot objects.

To make it work you could do this, which makes sure all plot objects contains different data sets 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]))

Upvotes: 6

Related Questions