Добавление большего количества узлов в центр «звездного» макета - igraph - PullRequest
0 голосов
/ 22 апреля 2020

Я хотел бы создать net -граф, который будет иметь 2 узла в середине, а остальные узлы окружают их. Ребра go от узлов "A" и "B" до остальных узлов, но они не связаны друг с другом.

Я обнаружил, что раскладка "star" из пакета igraph, вероятно, подойдет мне большинство. Теоретически возможно добавить больше узлов в центр «звезды» (страница справочника) , но это не работает для меня, так как независимо от указания двух узлов в параметре center остается только один.

#data
set.seed(1)
name <- LETTERS

a <- data.frame(from = "A", to = name)
b <- data.frame(from = "B", to = name)

sample <- rbind(a,b)
sample <- sample[-c(1,2,27,28), ] #please note removed edges between A-A, A-B, B-B, and B-A

#plot
g <- graph_from_data_frame(sample)
plot(g, layout = layout_as_star(g, center = V(g)[c("A", "B")]) )

enter image description here

1 Ответ

0 голосов
/ 27 апреля 2020

Я не думаю, что layout_as_star допускает несколько центров. Аргумент center на странице справки, на которую вы ссылаетесь, позволяет указать только один узел, а не несколько центров. Таким образом, чтобы получить то, что вы хотите, вам нужно сделать больше макета самостоятельно. Вот один из способов получить график в той форме, которую вы хотели. Я использую layout_as_star, чтобы выложить все узлы, кроме одного из центров. Но мы не хотим, чтобы оба «центра» находились в точном центре круга, иначе они перекрываются. Поэтому я перемещаю центр и создаю место для второго «центра».

library(igraph)

s1 = make_star(25, mode="out")
V(s1)$name = LETTERS[-2]

s2 = make_star(25, mode="out")
V(s2)$name = LETTERS[-1]

LO1 = layout_as_star(s1)

TwoCenters = union(s1, s2)

LO2 = LO1
LO2[1,] = c(-0.2, 0)
LO2 = rbind(LO2, c(0.2,0))

plot(TwoCenters, layout= LO2)

Star with Two Centers

...