使用networkD3和数据帧的定向图

时间:2017-02-19 05:42:21

标签: r data-visualization 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() R库下的networkD3函数,这可能对此有所帮助。但我真的不知道如何转换data.frame以用于此函数。提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

您需要两个数据框 - 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, ...

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

答案 1 :(得分:1)

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

simpleNetwork()将一个数据框作为其主要输入,默认情况下假设第一列是每个链接的“源”,第二列是每个链接的“目标”。它不需要描述节点的数据帧,因为它假定唯一的节点是链接到链接数据帧中某些节点的节点,并通过确定链接数据框中的唯一值在内部创建节点列表。

forceNetwork()功能更强大,更灵活,但它要求您传递两个数据帧,一个用于链接,另一个用于节点。您将参数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')