rigraphsna

R: Save multiple igraph plots


I have a function that creates multiple network plots using the igraph package and stores the networks in a list (g.list is the final output).

The function looks like this - and uses a list of dataframes (nodes and edges) to create the networks.

 network.fun <- function(nodes, edges){

  g <- graph_from_data_frame(d = edges, vertices = nodes, directed = FALSE)

  V(g)$color <- ifelse(V(g)$Treatment == "Water", ff.1[3], ff.1[4])

  w1 <- rescale(E(g)$weight, to = c(0,10))

  m1 <- layout_nicely(g) 

  plot(g, vertex.label.color = "black",
                   edge.color = 'dark grey', edge.width = w1, 
                   layout = m1, vertex.size = 24, vertex.label.font=2, 
                   vertex.label.dist=2.3, vertex.label.degree=4.3)


  return(g)


}

g.list <- map(out.list, ~ network.fun(nodes = .x$nodes, edges = .x$edges)) 

I want to know if it is possible to save each plot as a png file as it is created. I have 108 plots that are created and so would also like the plots to be named according to the nodes/edges dataframe name used to create them.


Solution

  • It doesn't look like you can save an igraph to an object, but you could save the plot directly by wrapping it in ggsave() like this:

     ggsave(paste0(plotName, ".png),
            plot(g, vertex.label.color = "black",
                           edge.color = 'dark grey', edge.width = w1, 
                           layout = m1, vertex.size = 24, vertex.label.font=2, 
                           vertex.label.dist=2.3, vertex.label.degree=4.3),
            height = 5, width = 5, dpi = 1000)
    

    You can add a plotName argument to your function and define it with a string (e.g. plotName = "plot_1"): if you're mapping over out.list, you can use the names of out.list like this:

    map2(out.list, names(out.list), ~ network.fun(plotName = .y, nodes = .x$nodes, edges = .x$edges))