**R snippets**, and kindly contributed to R-bloggers)

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

**(**igraph

**)**

**(**1

**)**

**<-**

**function**

**(**nei, p

**)**

**{**

**<-**replicate

**(**1000,

**{**

**<-**watts.strogatz.game

**(**1, 100, nei, p

**)**

**(**average.path.length

**(**wsg

**)**,

**(**wsg

**))**

**})**

**(**result, 1, quantile, probs

**=**c

**(**0.5, 0.05, 0.95

**))**

**}**

**<-**6

**<-**2

**^**

**–**seq

**(**0, 10, len

**=**21

**)**

**<-**sapply

**(**p, avg.stat, nei

**=**nei

**)**

**<-**t

**(**result

**/**rep

**(**avg.stat

**(**nei, 0

**)[**1,

**]**, each

**=**3

**))**

**(**mar

**=**c

**(**3.2, 2, 0.2, 0.2

**)**, mgp

**=**c

**(**2, 1, 0

**))**

**(**p, result, type

**=**“l”, log

**=**“x”, xaxt

**=**“n”, ylab

**=**“”,

**=**rep

**(**c

**(**1,2,2

**)**,2

**)**, col

**=**rep

**(**c

**(**1,2

**)**, each

**=**3

**))**

**(**1, at

**=**2

**^**

**-(**0

**:**10

**)**,

**=**c

**(**1, parse

**(**text

**=**paste

**(**2, 1

**:**10, sep

**=**“^-“,

**=**“;”

**))))**

**(**“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.

**leave a comment**for the author, please follow the link and comment on his blog:

**R snippets**.

R-bloggers.com offers

**daily e-mail updates**about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...