R Индексирование матрицы для использования в координатах графика - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь построить временную социальную сеть в R. Мой подход заключается в создании основного графика и макета для всех узлов.Затем я подгруппирую граф на основе ряда идентификаторов вершин.Однако, когда я делаю это и размечаю график, я получаю совершенно разные местоположения узлов.Я думаю, что я либо неправильно устанавливаю матрицу макетаЯ не могу определить, где моя проблема, потому что я выполнил несколько меньших матричных поднаборов, и все, кажется, работает нормально.

У меня есть пример кода и изображение проблемы на сетевых графиках.

library(igraph)

# make graph
g <- barabasi.game(25)




# make graph and set some aestetics 
set.seed(123)
l <- layout_nicely(g)
V(g)$size <- rescale(degree(g), c(5, 20))
V(g)$shape <- 'none'
V(g)$label.cex <- .75
V(g)$label.color <- 'black'

E(g)$arrow.size = .1

# plot graph

dev.off()

par(mfrow = c(1,2), 
    mar = c(1,1,5,1))


plot(g, layout = l, 
     main = 'Entire\ngraph')


# use index & induced subgraph

v_ids <- sample(1:25, 15, F)
sub_l <- l[v_ids, c(1,2)]
sub_g <- induced_subgraph(g, v_ids)


# plot second graph
plot(sub_g, layout = sub_l,
     main = 'Sub\ngraph') 

enter image description here

Вершины на втором графике должны соответствовать макету вершин на первом.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

К сожалению, вы установили случайное начальное число после того, как вы сгенерировали график, поэтому мы не можем точно воспроизвести ваш результат.Я буду использовать тот же код, но с set.seed до генерации графика.Это приводит к тому, что результат будет отличаться от вашего, но будет воспроизводимым.

Когда я запускаю ваш код, я не вижу точно такой же проблемы, как вы показываете.

Ваш код (с перемещением set.seed и добавлением scales)

library(igraph)
library(scales)            # for rescale function

# make graph
set.seed(123)
g <- barabasi.game(25)

# make graph and set some aestetics 
l <- layout_nicely(g)
V(g)$size <- rescale(degree(g), c(5, 20))
V(g)$shape <- 'none'
V(g)$label.cex <- .75
V(g)$label.color <- 'black'
E(g)$arrow.size = .1
## V(g)$names = 1:25

# plot graph
dev.off()

par(mfrow = c(1,2), 
    mar = c(1,1,5,1))

plot(g, layout = l, 
     main = 'Entire\ngraph')

# use index & induced subgraph
v_ids <- sort(sample(1:25, 15, F))
sub_l <- l[v_ids, c(1,2)]
sub_g <- induced_subgraph(g, v_ids)

# plot second graph
plot(sub_g, layout = sub_l,
     main = 'Sub\ngraph', vertex.label=V(sub_g)$names) 

Graph with positions preserved, but not labels

Когда я запускаю Ваш код , оба графика имеют узлы в одинаковых позициях.Это не то, что я вижу на графике в вашем вопросе.Я предлагаю вам запустить только этот код и посмотреть, не получите ли вы тот же результат (узлы в одинаковых позициях на обоих графиках).Единственная разница между двумя графиками в моей версии - это метки узлов.Когда вы берете подграф, он нумерует узлы от 1 до 15, поэтому метки на узлах не совпадают.Это можно исправить, сохранив метки узлов на графике, прежде чем брать подграф.В частности, добавьте V(g)$names = 1:25 сразу после вашего заявления E(g)$arrow.size = .1.Затем снова запустите все это , начиная с set.seed(123).Это сохранит исходную нумерацию в качестве меток узла.

Graph with node labels preserved

График выглядит немного иначе, поскольку новый подграф не занимает все пространство и растягивается, чтобы использовать пустоепространство.

0 голосов
/ 06 апреля 2019

Возможный быстрый способ: нарисуйте тот же график, но цветные узлы и вершины вам не нужны в цвете фона. В зависимости от ваших целей он может подойти вам.

...