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

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.

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)

Thank you
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:

The location of each node has to be mentioned and passed on to plot function.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With