user13822027
user13822027

Reputation: 71

Multi-panel network figure using a loop?

I'm trying to make a multipanel figure with networks in the igraph package. I'd like 2 rows, each with 3 networks. I need to be able to save the figure as a PNG and I'd like to label them each A:F in one of the corners. I've tried to do this in a loop but only one network appears in the figures. I need the V(nw)$x<- y and E(nw)$x<- y code in the loop to make my networks come out properly. My networks are in a list().

I've made a small sample of the code I've tried, I would like to avoid doing it without a loop if I can. Thanks in advance.

srs_1nw <- graph("Zachary")
srs_2nw <- graph("Heawood")
srs_3nw <- graph("Folkman")

srs_1c <- cluster_fast_greedy(srs_1nw)
srs_2c <- cluster_fast_greedy(srs_2nw)
srs_3c <- cluster_fast_greedy(srs_3nw) 

listofsrs_nws <- list(srs_1nw,srs_2nw,srs_3nw)
listofsrs_cs <- list(srs_1c,srs_2c,srs_3c)
  

colours <- c("red","blue","green","yellow")

par(mfrow=c(2,3))
for (i in length(listofsrs_nws)) {
  c<-listofsrs_cs[[i]]
  nw<-listofsrs_nws[[i]]
  
  V(nw)$size <- log(strength(nw))*6       # weighted nodes
  E(nw)$arrow.size <- 2                   # arrow size
  
  c.colours <- colours[membership(c)]
  
  plot(c, nw, col = c.colours,
     mark.col = adjustcolor(colours, alpha.f = 0.4),
     mark.border = adjustcolor(colours, alpha.f = 1),
     vertex.frame.width = 5, edge.curved = .15)
}

Upvotes: 0

Views: 47

Answers (1)

ThomasIsCoding
ThomasIsCoding

Reputation: 102241

We can use mapply like below

mapply(function(c, nw) {
  V(nw)$size <- log(strength(nw)) * 6 # weighted nodes
  E(nw)$arrow.size <- 2 # arrow size
  c.colours <- colours[membership(c)]
  plot(c, nw,
    col = c.colours,
    mark.col = adjustcolor(colours, alpha.f = 0.4),
    mark.border = adjustcolor(colours, alpha.f = 1),
    vertex.frame.width = 5, edge.curved = .15
  )
}, listofsrs_cs, listofsrs_nws)

enter image description here

Upvotes: 1

Related Questions