Home > Software engineering >  Save/export plots from list of plots as single .png files
Save/export plots from list of plots as single .png files

Time:08-16

I'm a bit stuck on this issue. I have this data obtained from a likert survey (so I make everything a factor):

df1<-data.frame(A=c(1,2,2,3,4,5,1,1,2,3),
              B=c(4,4,2,3,4,2,1,5,2,2),
              C=c(3,3,3,3,4,2,5,1,2,3),
              D=c(1,2,5,5,5,4,5,5,2,3),
              E=c(1,4,2,3,4,2,5,1,2,3),
              dummy1=c("yes","yes","no","no","no","no","yes","no","yes","yes"),
              dummy2=c("high","low","low","low","high","high","high","low","low","high"))

df1[colnames(df1)] <- lapply(df1[colnames(df1)], factor)

I then create a list of dataframes to be used in each plot:

vals <- colnames(df1)[1:5]
dummies <- colnames(df1)[-(1:5)]
step1 <- lapply(dummies, function(x) df1[, c(vals, x)])
step2 <- lapply(step1, function(x) split(x, x[, 6]))
names(step2) <- dummies
tbls <- unlist(step2, recursive=FALSE)
tbls<-lapply(tbls, function(x) x[(names(x) %in% names(df1[c(1:5)]))])

This is the plotting function I made (I used the likert package)

plot_likert <- function(x){
  
  y<-deparse(substitute(x))
  y<-sub("\\$", " - ",y)
  
  p<-plot(likert(x),
          type ="bar",center=3,
          group.order=names(x)) 
    labs(x = "Theme", subtitle=paste("Number of observations:",nrow(x)))  
    guides(fill=guide_legend("Rank")) 
    ggtitle(paste("How do they rank? -",gsub("\\.",": ",y)))
  
  png(filename=paste("Ranking -",y,".png"), width = 3000, height = 2000, res=300)
  print(p)
  dev.off()
}

So that now I can make the plot by writing:

plot_likert(tbls$dummy1.no)

Finally, I apply the function over the whole table by using

lapply(tbls,function(x) {
  y<-deparse(substitute(x))
  y<-sub("\\$", " - ",y)
  
  plot(likert(x),
          type ="bar",center=3,
          group.order=names(x)) 
    labs(x = "Theme", subtitle=paste("Number of observations:",nrow(x)))  
    guides(fill=guide_legend("Rank")) 
    ggtitle(paste("How do these themes rank? -",gsub("\\.",": ",y)))
}) -> list_plots

But now I don't know how to save each graph in the list as a separate .png file! I managed to put everything in a pdf like this, but it's not what I actually want:

ggsave(
  filename = "plots.pdf", 
  plot = marrangeGrob(list_plots, nrow=1, ncol=1), 
  width = 15, height = 9
)

Do you have any suggestions on how to fix this? Also, if you have anything to add about my function/procedure overall, everything is welcome! I'm still quite new to R.

Thanks in advance

CodePudding user response:

we can use:

sapply(1:length(list_plots), function(i) ggsave(
  filename = paste0("plots ",i,".pdf"), 
  plot = list_plots[[i]], 
  width = 15, height = 9
))

For names: see https://stackoverflow.com/a/73370416/5224236

mynames <- sapply(names(tbls), function(x) {
  paste("How do they rank? -",gsub("\\.",": ",x))
})

myfilenames <- names(tbls)

plot_likert <- function(x, myname, myfilename){
  p <- plot(likert(x),
          type ="bar",center=3,
          group.order=names(x)) 
    labs(x = "Theme", subtitle=paste("Number of observations:",nrow(x)))  
    guides(fill=guide_legend("Rank")) 
    ggtitle(myname)
  p
}

list_plots <- lapply(1:length(tbls),function(i) {
  plot_likert(tbls[[i]], mynames[i], myfilenames[i])
}) 
  • Related