seakyourpeak
seakyourpeak

Reputation: 551

Can't print all ggplot charts I need

There is a good discussion about using ggplot in loop and other creative ways at Looping over variables in ggplot. However, the discussion does not quite solve my problem.

I have a vertical dataset that I need to create plots from in a loop. There is no error in the code but my code only prints the last plot. Can't figure out why. Here is a reproducible example:

df <- cbind.data.frame(var = sample(c('a','b'), size = 100, replace = TRUE), 
                   grp = sample(c('x','y'), size = 100, replace = TRUE), value = rnorm(100))

for (i in 2) {

  plot.df <- df[which(df$var == c('a','b')[i]),] 
  print(ggplot(plot.df, aes(x = 1:nrow(plot.df), y = value, color = grp)) + 
      geom_line() + ggtitle(c('a','b')[i]))

}

Upvotes: 1

Views: 42

Answers (2)

Chuck P
Chuck P

Reputation: 3923

The comment by @EJJ is correct, your loop isn't you need something like

for (i in seq_along(1:nlevels(factor(df$var))))

library(ggplot2)
library(dplyr)

df <- cbind.data.frame(var = sample(c('a','b'), size = 100, replace = TRUE), 
                       grp = sample(c('x','y'), size = 100, replace = TRUE), value = rnorm(100))


for (i in seq_along(1:nlevels(factor(df$var)))) {

   plot.df <- df[which(df$var == c('a','b')[i]),] 
   print(ggplot(plot.df, aes(x = 1:nrow(plot.df), y = value, color = grp)) + 
            geom_line() + ggtitle(c('a','b')[i]))

}

Upvotes: 1

desval
desval

Reputation: 2435

As an alternative, you might also consider using lapply, as it makes the code a lot more readable.

If I am not mistaken you want to produce plots for each of the levels of the variable var.

You can firstly define your function, and then apply it to all levels

my_plot <- function(x){
  # debug: x <- "a"
  plot.df <- df[df$var %in% x,]
  ggplot(plot.df, aes(x = 1:nrow(plot.df), y = value, color = grp)) + 
    geom_line() + ggtitle(x)
}

lapply(unique(df$var), my_plot)

Upvotes: 1

Related Questions