user6131384
user6131384

Reputation:

Create hierarchical network

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

Upvotes: 3

Views: 1113

Answers (2)

Aman Deep Gautam
Aman Deep Gautam

Reputation: 8777

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.

Upvotes: 2

dougmet
dougmet

Reputation: 685

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

Upvotes: 1

Related Questions