Plotting Watts-Strogatz model

September 21, 2012
By

(This article was originally published at R snippets, and syndicated at StatsBlogs.)

Recently I wanted to reproduce Figure 2 from Watts and Strogatz (1998). The task using igraph is simple but an interesting task was annotation of the resulting plot.

Watts-Strogatz model generates graphs that have so called small-world network property. Such networks should have low average path length and high clustering coefficient. The algorithm has three parameters: number of nodes in the graph, initial number of neighbors of each node distributed on a ring and rewiring probability.

Interestingly in Watts-Strogatz model having small but positive values of rewiring probability generates graphs having desired properties - and this is exactly depicted on Figure 2 in their article.

I decided to replicate it. To enhance it I wanted to plot median and 5 and 95 percentile of distribution of average path length and clustering coefficient as a function of rewiring probability.

Here you have the code that generates the graph (warning: it takes about 1 minute to run):

library(igraph)
set.seed(1)

avg.stat <- function(nei, p) {
  result <- replicate(1000, {
    wsg <- watts.strogatz.game(1, 100, nei, p)
    c(average.path.length(wsg),
      transitivity(wsg))
  })
  apply(result, 1, quantile, probs = c(0.5, 0.05, 0.95))
}

nei <- 6
p <- 2 ^ -seq(0, 10, len = 21)
result <- sapply(p, avg.stat, nei = nei)
result <- t(result / rep(avg.stat(nei, 0)[1,], each = 3))
par(mar=c(3.220.20.2), mgp=c(210))
matplot(p, result, type = "l", log = "x", xaxt = "n", ylab = "",
        lty = rep(c(1,2,2),2), col=rep(c(1,2), each=3))
axis(1, at = 2 ^ -(0:10),
     labels =  c(1, parse(text = paste(2, 1:10, sep = "^-",
                                       collapse ";"))))
legend("bottomleft", c("average path length", "clustering coefficient"),
       lty = 1, col = c(1, 2))

The result of the procedure is the following picture:


It looks very similar to what is shown in the article (apart from adding lines depicting 5 and 95 percentile of distributions of both graph characteristics).

However, the interesting part was to properly annotate X-axis on the plot. Of course you can use expression function to get it but then the problem is that you have to do it ten times. Interestingly parsing a string containing those ten expressions separated by semicolons works just as needed.



Please comment on the article here: R snippets

Subscribe

Email:

  Subscribe