如何使用R中的以下数据帧绘制无向网络?

时间:2016-10-28 07:41:40

标签: r igraph networkd3

> 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包文档但找不到简单的方法。

提前谢谢你!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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数据框需要一列用于每个节点的“id”或名称,每个节点的组需要一列(如果有的话,您可以设置为1没有分组)。运行上面的代码后,nodes数据框看起来像这样......

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

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

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