感谢您提供的任何帮助。
我正在使用networkd3
中的R
包来绘制节点列表和链接(边缘列表)的forceNetwork
图。
我有一个边缘列表/链接列表:
> edgelist
round_prob NODEAid NODEBid
33979 0.6245 6990 6588
4899 0.9797 1042 1041
37109 0.6046 7498 7531
27771 0.7144 5906 16029
3603 0.6452 783 804
28491 0.6078 6034 5862
4518 0.6245 962 9874
19613 0.6745 4121 10285
19916 0.8721 4179 4180
8249 0.6821 1737 1733
35389 0.7150 7145 16992
32010 0.6495 6728 16921
22553 0.6959 4722 4549
14996 0.6031 3273 12929
35927 0.6245 7221 9814
15349 0.6245 3337 3233
34833 0.6109 7085 6852
39044 0.6117 7936 7977
39075 0.6844 7944 10978
11691 0.6821 2572 2587
这是一个更大的边缘列表的样本,我只选择链接概率> 0.6且<1的链接。在采集样本之前,完整的边缘列表 是零索引的。
我还有一个节点列表,长度为18000行。它的一个例子就是:
> head(nodes)
node id gr
0 1097 0 1
1 1149 1 1
2 1150 2 1
3 3395 3 1
4 3396 4 1
5 3523 5 1
我尝试使用forceNetwork
绘图:
forceNetwork(Links = edgelist, Nodes = nodes, Source = "NODEAid",
Target = "NODEBid", Value = "round_prob", NodeID = "node",
Group = "gr", opacity = 0.9)
这在放大之前给出了这个图:
问题:我只有20对节点,但我的情节还有数千个(我无法返回数字)。
通过将鼠标悬停在未连接的点上,我能够识别出它们是由节点列表中所有可能的节点组成的。
基本上我认为forceNetwork
正在绘制每个可能的节点,即使是那些不在边缘列表中的节点。
为什么会发生这种情况?如何阻止它这样做?
根据这个问题Going crazy with forceNetwork in R: no edges displayed我确保我的所有数据都是数字格式且零索引。我仍然得到这个错误。
注意:如果我在此问题How to plot a directed Graph in R with networkD3?和本教程https://christophergandrud.github.io/networkD3/中运行forceNetwork示例,则输出符合预期。
答案 0 :(得分:2)
我认为您应该对节点列表进行子集,使其仅包含边缘列表中的节点。
答案 1 :(得分:2)
我建议使用simpleNetwork
,它会根据您传递的边缘列表自动创建节点列表,或者使用与simpleNetwork
类似的代码来创建节点列表,然后将其传递给forceNetwork
...
edgelist <- read.table(header = T, text = "
round_prob NODEAid NODEBid
33979 0.6245 6990 6588
4899 0.9797 1042 1041
37109 0.6046 7498 7531
27771 0.7144 5906 16029
3603 0.6452 783 804
28491 0.6078 6034 5862
4518 0.6245 962 9874
19613 0.6745 4121 10285
19916 0.8721 4179 4180
8249 0.6821 1737 1733
35389 0.7150 7145 16992
32010 0.6495 6728 16921
22553 0.6959 4722 4549
14996 0.6031 3273 12929
35927 0.6245 7221 9814
15349 0.6245 3337 3233
34833 0.6109 7085 6852
39044 0.6117 7936 7977
39075 0.6844 7944 10978
11691 0.6821 2572 2587
")
library(networkD3)
simpleNetwork(edgelist, Source = 'NODEAid', Target = 'NODEBid')
sources <- edgelist$NODEAid
targets <- edgelist$NODEBid
node_names <- factor(sort(unique(c(as.character(sources),
as.character(targets)))))
nodes <- data.frame(name = node_names, group = 1, size = 8)
links <- data.frame(source = match(sources, node_names) - 1,
target = match(targets, node_names) - 1,
value = edgelist$round_prob)
forceNetwork(Links = links, Nodes = nodes, Source = "source",
Target = "target", Value = "value", NodeID = "name",
Group = "group", opacity = 0.9)