R:保存多个 igraph 图

R: Save multiple igraph plots

我有一个函数可以使用 igraph 包创建多个网络图并将网络存储在列表中(g.list 是最终输出)。

该函数如下所示 - 并使用数据帧列表(节点和边)来创建网络。

 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)) 

我想知道是否可以在创建每个绘图时将其保存为 png 文件。我创建了 108 个图,因此也希望根据用于创建它们的 nodes/edges 数据框名称来命名这些图。

看起来你不能将 igraph 保存到一个对象,但你可以通过将它包装在 ggsave() 中直接保存绘图,如下所示:

 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)

您可以向您的函数添加一个 plotName 参数并使用字符串定义它(例如 plotName = "plot_1"):如果您映射到 out.list,您可以使用名称out.list 个像这样:

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