为什么 networkd3 R 中的 forceNetwork 显示所有不在边缘列表中的节点?
Why does forceNetwork in networkd3 R display all nodes not in edgelist?
感谢您提供的任何帮助。
我正在使用 R
中的 networkd3
包来绘制节点列表和 links(边缘列表)的 forceNetwork
图。
我有一个边缘列表/link列表:
> 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
这是一个更大边列表的样本,我只选择了 link 概率 >0.6 和 <1 的那些 link。在采样之前,完整的边列表 是 零索引。
我还有一个节点列表,有 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 对节点,但我的地块有数千对(我不能 return 这个数字)。
通过将鼠标悬停在未连接的点上,我已经能够确定它们是由节点列表中所有可能的节点组成的。
基本上我认为 forceNetwork
正在绘制每个可能的节点,即使是那些不在边缘列表中的节点。
为什么会发生这种情况,我该如何阻止它发生?
根据这个问题Going crazy with forceNetwork in R: no edges displayed,我确保我所有的数据都是数字格式和零索引。我仍然收到此错误。
注意:如果我 运行 这个问题中的 forceNetwork 示例 and from this tutorial https://christophergandrud.github.io/networkD3/ 输出是预期的。
我认为您应该对节点列表进行子集化,使其仅包含边缘列表中的节点。
我建议使用 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)
感谢您提供的任何帮助。
我正在使用 R
中的 networkd3
包来绘制节点列表和 links(边缘列表)的 forceNetwork
图。
我有一个边缘列表/link列表:
> 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
这是一个更大边列表的样本,我只选择了 link 概率 >0.6 和 <1 的那些 link。在采样之前,完整的边列表 是 零索引。
我还有一个节点列表,有 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 对节点,但我的地块有数千对(我不能 return 这个数字)。
通过将鼠标悬停在未连接的点上,我已经能够确定它们是由节点列表中所有可能的节点组成的。
基本上我认为 forceNetwork
正在绘制每个可能的节点,即使是那些不在边缘列表中的节点。
为什么会发生这种情况,我该如何阻止它发生?
根据这个问题Going crazy with forceNetwork in R: no edges displayed,我确保我所有的数据都是数字格式和零索引。我仍然收到此错误。
注意:如果我 运行 这个问题中的 forceNetwork 示例
我认为您应该对节点列表进行子集化,使其仅包含边缘列表中的节点。
我建议使用 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)