Направленный график с использованием networkD3 и фрейма данных

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

library(networkD3)    
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx", "zXZK7fkzrpPpJdb", 
                "ZyaTheKing", "zzzcccbbbmmm")    
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:", 
             "visecs:", "Charles_HRH:")    
n <- c(1L, 1L, 1L, 1L, 1L, 1L)   
data <- data.frame(screenName,mention,n)    
simpleNetwork(data)

Приведенный выше код позволяет построить интерактивный неориентированный сетевой граф. Я наткнулся на функцию forceNetwork() в библиотеке networkD3R, которая может здесь помочь. Но я действительно не знаю, как преобразовать data.frame для его использования в этой функции. Заранее спасибо!


person adhok    schedule 19.02.2017    source источник
comment
Взгляните на пакет ggraph и функцию graph_from_data_frame()   -  person Simon Jackson    schedule 19.02.2017
comment
Я не уверен, с чем вы просите помощи. Вы просто даете ему список необходимых узлов, ссылок и параметров, и он строится без проблем. Проверьте здесь, помогают ли объяснение и пример ... cran.r -project.org/web/packages/networkD3/networkD3.pdf   -  person sconfluentus    schedule 19.02.2017
comment
@bethanyP В функции forceNetwork() есть параметры, называемые _1 _, _ 2_ и Group. Какие значения передать этим параметрам?   -  person adhok    schedule 19.02.2017
comment
@Simon Jackson Я тоже пробовал использовать пакет ggraph. С теми данными, которые у меня есть, он становится слишком переполненным, даже если repel установлен как TRUE.   -  person adhok    schedule 19.02.2017
comment
@adhok в этом случае, я бы сказал, что вам понадобится другой сюжет, или для фильтрации определенных соединений или узлов, прежде чем переходить к объекту графика.   -  person Simon Jackson    schedule 19.02.2017
comment
Оба simpleNetwork и forceNetwork создадут график, направленный по силе. Чтобы получить нужный график из forceNetwork, вам нужно больше полей данных. У вас недостаточно информации об объектах графа. У вас должны быть узлы с идентификаторами и назначить исходные узлы для взаимодействия, которые являются начальными и целевыми узлами, которые являются получателем, вам нужны значения для ссылок (также называемых ребрами), которые передают интенсивность отношений в графике сил. У вас есть три поля с непонятными идентификаторами ... которые необходимо разрешить.   -  person sconfluentus    schedule 19.02.2017
comment
@adhok извините, я имел в виду пакет igraph (похоже, не могу отредактировать другой свой комментарий через мобильное приложение)   -  person Simon Jackson    schedule 19.02.2017


Ответы (2)


Функции simpleNetwork() и forceNetwork() предназначены для работы по-разному.

simpleNetwork() принимает один фрейм данных в качестве основного ввода и по умолчанию предполагает, что первый столбец является «источником» каждой ссылки, а второй столбец - «целью» каждой ссылки. Он не требует фрейма данных, описывающего узлы, потому что он предполагает, что единственными узлами являются те, которые связаны с чем-то в фрейме данных ссылки, и создает список узлов внутри, определяя уникальные значения во фрейме данных ссылок.

forceNetwork() более мощный и гибкий, но он требует, чтобы вы передавали два фрейма данных, один для ссылок и один для узлов. Вы передаете параметру Nodes фрейм данных, содержащий список уникальных узлов. Параметры NodeID и Group являются символьными значениями, которые определяют имя столбца в фрейме данных узлов, который содержит эту информацию, например NodeID = 'name' и Group = 'type'. Столбец Group во фрейме данных узлов используется для определения цвета узлов и на самом деле не является необходимым, но forceNetwork() этого требует, поэтому вы можете просто создать столбец в кадре данных узлов, который имеет одинаковое значение для каждой строки, например 1.

Вы можете взять приведенный выше код и создать необходимые фреймы данных для использования forceNetwork() вот так (например) ...

library(networkD3)
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx", 
                "zXZK7fkzrpPpJdb", "ZyaTheKing", "zzzcccbbbmmm")
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:", 
             "visecs:", "Charles_HRH:")
n <- c(1L, 1L, 1L, 1L, 1L, 1L)

nodeFactors <- factor(sort(unique(c(screenName, mention))))
nodes <- data.frame(name = nodeFactors, group = 1)

screenName <- match(screenName, levels(nodeFactors)) - 1
mention <- match(mention, levels(nodeFactors)) - 1
links <- data.frame(screenName, mention, n)

forceNetwork(Links = links, Nodes = nodes, Source = 'screenName', 
             Target = 'mention', Value = 'n', NodeID = 'name', Group = 'group')
person CJ Yetman    schedule 19.02.2017

Поясню на примере из документации.

Вам понадобятся два фрейма данных - links и nodes.

data(MisLinks)
glimpse(MisLinks)
#Observations: 254
#Variables: 3
#$ source <int> 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 11, 11, 11, 11, 12, 13, 14, 15, 17, 18, 18, 19, 19, 1...
#$ target <int> 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 10, 3, 2, 0, 11, 11, 11, 11, 16, 16, 17, 16, 17, 18, ...
#$ value  <int> 1, 8, 10, 6, 1, 1, 1, 1, 2, 1, 1, 3, 3, 5, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4...

length(unique(c(MisLinks$source,MisLinks$target)))
#[1] 77

data(MisNodes)
glimpse(MisNodes)
#Observations: 77
#Variables: 3
#$ name  <fctr> Myriel, Napoleon, Mlle.Baptistine, Mme.Magloire, CountessdeLo, Geborand, Champterci...
#$ group <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 4, ...
#$ size  <int> 15, 20, 23, 30, 11, 9, 11, 30, 8, 29, 29, 9, 18, 12, 16, 22, 21, 11, 19, 10, 8, 13, ...

Каждая запись в source и target фрейма данных links является узлом (целые числа 0,1, ..., n). В этом случае имеется 77 уникальных узлов. Итак, вам понадобится nodes фрейм данных с 77 узлами, описывающими атрибуты узлов. Первая запись в nodes фрейме данных - это узел 0, следующая запись - это узел 1 и так далее. Фрейм данных nodes должен быть отсортирован в соответствии с этой последовательностью. Это единственный способ привязать nodes фрейм данных к links фрейму данных.

# Create graph
forceNetwork(Links = MisLinks, Target = "target", Value = "value", 
             Nodes = MisNodes, Source = "source", NodeID = "name", Group = "group", 
             opacity = 0.4, zoom = TRUE)
person Karthik Arumugham    schedule 19.02.2017