A simple toy example of a three layered network:
Note 1: In order to view the 3D plots, mac users will need Xquartz installed (https://www.xquartz.org/).
require(igraph)
require(rgl)
#Another package that might be needed is "rglwidget". The function writeWebGL will show an error stating if rglwidget is required.
######################################////
######The basics######################////
######################################////
#1) Create a "food" network (three layers)
set.seed(432)
g1<-watts.strogatz.game(dim = 1,size = 5,nei = 2,p = .5,loops = FALSE,multiple = FALSE)
g2<-watts.strogatz.game(dim = 1,size = 10,nei = 2,p = .2,loops = FALSE,multiple = FALSE)
g3<-watts.strogatz.game(dim = 1,size = 30,nei = 1,p = .5,loops = FALSE,multiple = FALSE)
g123=g1+g2+g3
#Create more edges btw layers
g123=rewire(g123,each_edge(prob=.4,loops = FALSE,multiple = FALSE))
ne=15;add_edges(g123,edges = cbind(sample(1:vcount(g1),size = ne,replace = TRUE), sample((vcount(g1)+1):vcount(g123),size = ne,replace = TRUE)))#top layer
ne=30;add_edges(g123,edges = cbind(sample((vcount(g1)+1):(vcount(g1)+vcount(g2)),size = ne,replace = TRUE), sample((vcount(g1)+vcount(g2)+1):vcount(g123),size = ne,replace = TRUE)))#second layer
#A quick plot of the graph
plot(g123,vertex.size=1,vertex.label.cex=0.02)
#Create 3d coordinates of the network layout
circpos=function(n,r=1){#Coordinates on a circle
rad=seq(0,2*pi,length.out=n+1)[-1];x=cos(rad)*r;y=sin(rad)*r
return(cbind(x,y))
}
#
lay=rbind(cbind(circpos(vcount(g1),r=1), runif(n = vcount(g1),-1,1)),
cbind(circpos(vcount(g2),r=2), runif(n = vcount(g2),6,7)),
cbind(circpos(vcount(g3),r=4), runif(n = vcount(g3),13,17))
)
#2d plot using the previous layout
plot(g123,vertex.size=5,vertex.label=NA,layout=lay[,c(1,3)])
plot(g123,vertex.size=1,vertex.label=NA,layout=lay[,c(1,2)])
#3D graph plot
#Add some colour to nodes and edges
nodecols=c(rep("red",vcount(g1)),
rep("blue",vcount(g2)),
rep("yellow",vcount(g3)))
edgecols=function(elist,cols,grouplist){
whatcol=rep(length(cols)+1,nrow(elist))
finalcol=whatcol
for(i in 1:nrow(elist)){
for(k in length(cols):1){
if( k * (length( intersect(elist[i,], grouplist[[k]]) ) > 0)){
whatcol[i]=min(whatcol[i], k )
}
}
finalcol[i]=cols[whatcol[i]]
}
return(finalcol)
}
#Open 3d viewer
rgl.open()
rglplot(g123, layout=lay,vertex.size=5,vertex.label=NA,vertex.color=nodecols,
edge.color=edgecols(elist=get.edgelist(g123,names = FALSE),cols=c("orange","green","pink"),grouplist=list(1:vcount(g1), (vcount(g1)+1):(vcount(g1)+vcount(g2)), (vcount(g1)+vcount(g2)+1):vcount(g123)) )
)
###Storing the plot in an html file###
dirfolder="..." #your dir
#rgl.open()#instead of rgl.open use open3d, in order to save the plot.
open3d()
rglplot(g123, layout=lay,vertex.size=5,vertex.label=NA,vertex.color=nodecols,
edge.color=edgecols(elist=get.edgelist(g123,names = FALSE),cols=c("orange","green","pink"),grouplist=list(1:vcount(g1), (vcount(g1)+1):(vcount(g1)+vcount(g2)), (vcount(g1)+vcount(g2)+1):vcount(g123)) )
)
#Fix the view
rgl.viewpoint(theta=90, phi=0)
#Save a static 2d image:
rgl.snapshot(paste(dirfolder,"a_png_pic_0.png",sep=""), fmt="png", top=TRUE)
#Save the plot in a .htlm file:
rglfolder=writeWebGL(dir = paste(dirfolder,"first_net3d",sep=""), width=700)
#The previous function should create a file called index.htlm inside the folder "first_net3d". By opening this file in a browser (with javascript enabled) the 3d plot will be displayed again.
#Also the following command will open the plot in the browser:
browseURL(rglfolder)
Note 2: In order to view the .htlm file javascript should be enabled in the browser. (Here is an example on how to do this for safari ).
Although not covered in the previous script, further options are available such as edge/vertex size and the ability to control independently each of the nodes and edges in the graph. Here is an example that makes more use of these options:
3d network representing a T cell receptor. Edges are coloured according to a relevant path found between the bottom green node and the upper red node cluster.
T cell receptor (in blue), binding to a peptide (in red).