Почему forceNetwork в networkd3 R отображает все узлы, которых нет в edgelist?

Спасибо за любую помощь, которую вы можете предоставить.

Я использую пакет networkd3 в R для построения forceNetwork графика нодлиста и ссылок (edgelist).

У меня есть список публикаций / ссылок:

> edgelist

      round_prob NODEAid NODEBid
33979     0.6245    6990    6588
4899      0.9797    1042    1041
37109     0.6046    7498    7531
27771     0.7144    5906   16029
3603      0.6452     783     804
28491     0.6078    6034    5862
4518      0.6245     962    9874
19613     0.6745    4121   10285
19916     0.8721    4179    4180
8249      0.6821    1737    1733
35389     0.7150    7145   16992
32010     0.6495    6728   16921
22553     0.6959    4722    4549
14996     0.6031    3273   12929
35927     0.6245    7221    9814
15349     0.6245    3337    3233
34833     0.6109    7085    6852
39044     0.6117    7936    7977
39075     0.6844    7944   10978
11691     0.6821    2572    2587

Это образец гораздо более крупного edgelist, где я выбрал только те ссылки с вероятностью ссылки> 0,6 и ‹1. Полный список edgelist был проиндексирован до нуля перед взятием образца.

У меня также есть нодлист, длина которого составляет 18000 строк. Пример этого:

> head(nodes)

  node id gr
0 1097  0  1
1 1149  1  1
2 1150  2  1
3 3395  3  1
4 3396  4  1
5 3523  5  1

Я пытаюсь построить график, используя forceNetwork:

forceNetwork(Links = edgelist, Nodes = nodes, Source = "NODEAid",
             Target = "NODEBid", Value = "round_prob", NodeID = "node",
             Group = "gr", opacity = 0.9)

Это дает этот график до увеличения:

введите описание изображения здесь

Проблема: у меня всего 20 пар узлов, но на моем графике их еще тысячи (я не могу вернуть число).

Наведя курсор на несвязанные точки, я смог определить, что они состоят из всех возможных узлов, представленных в списке узлов.

В основном я думаю, что forceNetwork рисует все возможные узлы, даже те, которых нет в списке.

Почему это происходит и как мне этого не допустить?


Согласно этому вопросу Схожу с ума с forceNetwork в R: края не отображаются Я убедился, что все мои данные были в числовом формате и не проиндексированы. Я все еще получаю эту ошибку.

Примечание. Если я запустил пример forceNetwork в этом вопросе, как построить ориентированный график в R с помощью networkD3? и из этого руководства https://christophergandrud.github.io/networkD3/ вывод такой, как ожидалось.


person Chuck    schedule 12.05.2017    source источник


Ответы (2)


Я бы посоветовал либо использовать simpleNetwork, который автоматически создает список узлов на основе переданного вами списка краев, либо использовать аналогичный код, как это делает simpleNetwork, чтобы сначала создать список узлов, а затем передать его _3 _...

edgelist <- read.table(header = T, text = "
round_prob NODEAid NODEBid
33979     0.6245    6990    6588
4899      0.9797    1042    1041
37109     0.6046    7498    7531
27771     0.7144    5906   16029
3603      0.6452     783     804
28491     0.6078    6034    5862
4518      0.6245     962    9874
19613     0.6745    4121   10285
19916     0.8721    4179    4180
8249      0.6821    1737    1733
35389     0.7150    7145   16992
32010     0.6495    6728   16921
22553     0.6959    4722    4549
14996     0.6031    3273   12929
35927     0.6245    7221    9814
15349     0.6245    3337    3233
34833     0.6109    7085    6852
39044     0.6117    7936    7977
39075     0.6844    7944   10978
11691     0.6821    2572    2587
")

library(networkD3)

simpleNetwork(edgelist, Source = 'NODEAid', Target = 'NODEBid')

sources <- edgelist$NODEAid
targets <- edgelist$NODEBid
node_names <- factor(sort(unique(c(as.character(sources), 
                                   as.character(targets)))))
nodes <- data.frame(name = node_names, group = 1, size = 8)
links <- data.frame(source = match(sources, node_names) - 1, 
                target = match(targets, node_names) - 1, 
                value = edgelist$round_prob)

forceNetwork(Links = links, Nodes = nodes, Source = "source",
             Target = "target", Value = "value", NodeID = "name",
             Group = "group", opacity = 0.9)
person CJ Yetman    schedule 12.05.2017
comment
Код (после simpleNetwork) делает то, что нужно. И вы правы в том, что решением было бы сначала создать свой список узлов на основе переданного вами списка ребер, а затем передать оба, а затем forceNetwork. Всего одна мелочь. На simpleNetwork(edgelist) , потому что df находится не в ожидаемом порядке, он показывает график немного неверно. - person Mamonu; 13.05.2017
comment
Я изменил команду simpleNetwork в приведенном выше коде ... вы можете явно указать имена столбцов для источника и цели. - person CJ Yetman; 13.05.2017
comment
@CJYetman Сработал как шарм - большое спасибо за вашу помощь :) Таким образом, индекс nodes (который, предварительно заказав исходные 4-значные идентификаторы узлов, сбрасывается до нуля), используется для кодирования идентификаторов source и target. Значит, значения в source в target должны соответствовать идентификатору сброса на `узлах`, не (в данном случае) исходным 4-значным идентификаторам, оставшимся от выборки исходных данных? - person Chuck; 15.05.2017
comment
Значения в источнике и цели во фрейме данных ссылок должны соответствовать строке / индексу узла, на который они ссылаются в фрейме данных узлов ... но поскольку он передается в JavaScript, JS рассматривает первую строку / индекс как 0 , а не 1, как R. - person CJ Yetman; 15.05.2017
comment
@CJYetman И снова привет. Просто дополнительный вопрос к вам - когда вы выполняете преобразование, в links ваши value по умолчанию 1. Как я могу сделать это равным исходной вероятности ссылки round_prob в edgelist? Спасибо - person Chuck; 16.05.2017
comment
Я изменил приведенный выше код, чтобы установить в столбце Value значения round_prob. Однако это действительно небольшие значения, поэтому вы можете захотеть их как-то преобразовать. - person CJ Yetman; 16.05.2017
comment
Как мы можем получить сеть, если у нас есть только список ребер и НЕТ списка узлов, что-то вроде списка адресов электронной почты, социальной сети или чего-то еще, где наблюдается поведение кластера? - person Sitz Blogz; 23.11.2017
comment
Это то, что показывает пример ... построение списка узлов на основе ваших ребер. - person CJ Yetman; 24.11.2017

Я бы подумал, что вам следует подмножество списка узлов, чтобы он включал только узлы, которые находятся в списке ребер.

person Christopher Gandrud    schedule 12.05.2017
comment
Привет, Кристофер. Искренне благодарю за ваш ответ. Я попробовал это, но ничего не вышло. Однако то, что я не сделал, - это сбросить индекс для любого списка узлов edgelist после (т.е. у меня есть некоторое подмножество обоих, с исходными идентификаторами 1097 1149 ..., мне нужно снова сбросить эти идентификаторы с 0. Я буду повторно реализовывать с это и вернуться к вам. Еще раз мое искреннее спасибо. - person Chuck; 12.05.2017
comment
Привет, Кристофер. Благодаря @CJYetman мне удалось заставить это работать. Я думаю, что, если бы он не ответил, ваше предложение тоже подошло бы. Большое спасибо за ваш ответ и за написание этого пакета. Хорошего дня :) - person Chuck; 15.05.2017