2016-04-25 2 views
3

Есть ли способ в R создать иерархическую сеть, подобную этой?Создание иерархической сети

enter image description here

То есть, прежде чем он генерирует концентратор 5 узлов, к которым присоединены другие 4 концентраторов, и так далее, пока вы не получите общую сеть.

enter image description here

Я думаю, что я могу использовать функцию make_tree igraph, но я не знаю, как добавить концентраторы итеративно. Это то, что я сделал.

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

enter image description here

Спасибо

ответ

2

Не знаете, как это элегантный. Требуется больше работы, чтобы заставить сюжет выглядеть как ваш, но я думаю Граф верный.

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) 

Это кажется достаточно быстрым (хотя построение графика выходит из-под контроля более чем на 3 или 4 итерации).

1

У меня было такое же требование. Следующий код генерирует график, кроме поворота централизованного подграфа.

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) 

График генерируемый: enter image description here

Расположение каждого узла должно быть упомянуто и передается на plot функции.

Смежные вопросы