2017-02-19 64 views
0

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

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) 

上述代码允许构建交互式无向网络图。我遇到了networkD3 R库下的forceNetwork()函数,这可能对此有所帮助。但我真的不知道如何转换data.frame在这个函数中的用法。先谢谢你!

+0

看看GGRAPH包和功能,'graph_from_data_frame( )' –

+0

我不确定你在寻求什么帮助。您只需将它列出所需的节点,链接和参数,并无缝地绘制图形。检查这里看看解释和例子是否有帮助... https://cran.r-project.org/web/packages/networkD3/networkD3.pdf – sconfluentus

+0

@bethanyP有一些参数叫'Nodes','NodeID'和' ''forceNetwork()'函数中的组。我应该将哪些值传递给这些参数? – adhok

回答

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

sourcelinks数据帧的target每个条目是一个节点(整数0,1,...,N)。在这种情况下,有77个独特节点。所以你需要一个带有77个节点描述节点属性的nodes数据帧。 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

功能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')