2016-10-28 30 views
1
> nodes1 <- c('A','B','C') 
> nodes2 <- c('S','C','B') 
> values <- c(1.0,0.45,0.44) 
> data <- data.frame(nodes1,nodes2,values) 

上面的数据框有三列。前两列表示节点,第三列表示它们之间的权重。这是一个无向图。我查了一下networkD3软件包的文档,但找不到一个简单的方法来做到这一点。如何在R中使用以下数据框绘制无向网络?

感谢您提前!

回答

1

我认为你可以使用igraph,边的宽度由数据框中列的值决定。

library("igraph") 
graph <- make_graph(t(data[,c("nodes1" , "nodes2")]), directed = F) 
E(graph)$weight <- data$values 
plot.igraph(graph, edge.width=E(graph)$weight) 
0

要使用forceNetwork()功能networkD3,你需要链接一个数据帧和节点一个数据帧。使用您的载体上面,你可以创建适当的数据帧,并将它们传递给forceNetwork()像这样...

library(networkD3) 
nodes <- data.frame(id = unique(c(nodes1, nodes2)), group = 1) 
links <- data.frame(source = match(nodes1, nodes$id) - 1, 
        target = match(nodes2, nodes$id) - 1, 
        value = values) 
forceNetwork(Links = links, Nodes = nodes, Source = 'source', Target = 'target', 
      Value = 'value', NodeID = 'id', Group = 'group') 

nodes数据帧需要一列的每个节点的“身份证”或名称,以及一个列每个节点的组(如果它们没有分组,则可以将其设置为1)。运行上述代码之后,nodes数据帧看起来像这样:

id group 
1 A  1 
2 B  1 
3 C  1 
4 S  1 

links数据帧需要1行用于每一个链路/边缘,和一列的链接的“源”,一列对于每个链接的“目标”,以及对于每个链接的“值”的一列。 “源”和“目标”值等于它们引用的数据框中的节点索引,但它们必须为零索引才能与底层JavaScript配合使用。运行上面的代码后,links数据帧看起来像这样...

source target value 
1  0  3 1.00 
2  1  2 0.45 
3  2  1 0.44