> 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
包文档,但找不到简单的方法。
先感谢您 !
要使用 中的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
我认为您可以使用 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)