使用 networkD3 和数据框的有向图

Directed Graph using networkD3 and a data frame

我已经包含了一个数据框,它描述了我正在使用的数据的一个非常小的子集。由于数据中的节点数量众多,我的目标是构建一个交互式网络。

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)

以上代码允许构建交互式无向网络图。我在 networkD3R 库下遇到了 forceNetwork() 函数,这可能对这里有帮助。但我真的不知道如何将 data.frame 转换为它在此函数中的用法。提前谢谢您!

让我用文档中的例子来解释一下。

您需要两个数据框 - linksnodes

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, ...

links 数据帧的 sourcetarget 中的每个条目都是一个节点(整数 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)

函数 simpleNetwork()forceNetwork() 的设计工作方式不同。

simpleNetwork() 将一个数据框作为其主要输入,默认情况下假定第一列是每个 link 的 'source',第二列是 'target' 每个 link。它不需要描述节点的数据框,因为它假定唯一的节点是 linked 到 link 数据框中的某些节点,并通过确定 link 中的唯一值在内部创建节点列表 links数据框。

forceNetwork()更强大和灵活,但它需要你传递两个数据帧,一个用于links,一个用于节点。您将包含唯一节点列表的数据框传递给参数 Nodes。参数 NodeIDGroup 是字符值,用于定义节点数据框中包含该信息的列的名称,例如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')