Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create hierarchical network

Tags:

r

igraph

There is a way in R to create a hierarchical network like this?

enter image description here

That is, before it generates a hub of 5 nodes, to which are attached other 4 hubs, and so on until you get the general network.

enter image description here

I think I can use the make_tree igraph function, but I don't know how to add hubs iteratively. This is what I did.

net <- make_tree(n = 5, children = 4, mode = "undirected")
plot(net)

enter image description here

Thank you


2 Answers

I had similar requirement. The following code generates the graph, only except the rotation of the centre subgraph.

n = 5
periphery = c(2,3,4,5)

#Make the seed graph.
g <- make_empty_graph(n, directed = FALSE) + edges(1,2,1,3,1,4,1,5,2,3,2,4,2,5,3,4,3,5,4,5)
g_main <- make_empty_graph(directed = FALSE)

#Create the layout for the initial 5 nodes.
xloc <- c(0,.5,.5,-.5,-.5)
yloc <- c(0,-.5,.5,.5,-.5)
#Shift for each iteration.
xshift <- 3*xloc
yshift <- 3*yloc

xLocMain <- c()
yLocMain <- c()
allperifery <- c()

for (l in 1:n) {
  g_main <- g_main + g
  xLocMain <- c(xLocMain, xloc + xshift[l])
  yLocMain <- c(yLocMain, yloc + yshift[l])
  if (l != 1) {
    #Calculate periphery nodes.
    allperifery <- c(allperifery, (l-1)*n + periphery)
  }
}
#Connect each periphery node to the central node.
for (y in allperifery) {
  g_main <- g_main + edges(1, y)
}

## Repeat the same procedure for the second level.
xLocMM <- c()
yLocMM <- c()

xshiftNew <- 10*xloc
yshiftNew <- 10*yloc

g_mm <- make_empty_graph(directed = FALSE)
allpp <- c()
for (l in 1:n) {
  g_mm <- g_mm + g_main
  xLocMM <- c(xLocMM, xLocMain + xshiftNew[l])
  yLocMM <- c(yLocMM, yLocMain + yshiftNew[l])
  if (l != 1) {
    allpp <- c(allpp, (l-1)*(n*n) + allperifery)
  }
}

for (y in allpp) {
  g_mm <- g_mm + edges(1, y)
}

l <- matrix(c(rbind(xLocMM, yLocMM)), ncol=2, byrow=TRUE)
plot(g_mm, vertex.size=2, vertex.label=NA, layout = l)

The graph generated is: enter image description here

The location of each node has to be mentioned and passed on to plot function.

like image 105
Aman Deep Gautam Avatar answered Aug 25 '26 23:08

Aman Deep Gautam


Not sure how elegant this is. It would take more work to get the plot to look like yours but I think the graph is correct.

library(igraph)

#' This adds the gadd graph to the main graph, g, and wires all of its vertices
#' to the central vertex of g
attach_to_center <- function(g, gadd) {
  g <- g + gadd + edges(as.vector(rbind(1, gorder(g) + 1:gorder(gadd))))
}

nIter <- 2
nChild <- 4

# The initial graph
g <- make_empty_graph(5, directed = FALSE) + edges(1,2,1,3,1,4,1,5,2,3,3,4,4,5,5,2)

for (j in 1:nIter) {
  g0 <- g
  for (i in 1:nChild) {
    g <- attach_to_center(g, g0)
  }
}

plot(g, vertex.label = NA)

It seems quick enough (although plotting gets out of hand for more than 3 or 4 iterations).

like image 40
dougmet Avatar answered Aug 25 '26 22:08

dougmet



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!