【问题标题】:Why does forceNetwork in networkd3 R display all nodes not in edgelist?为什么networkd3 R中的forceNetwork显示所有不在edgelist中的节点?
【发布时间】:2017-10-11 21:03:22
【问题描述】:

感谢您提供的任何帮助。

我正在使用R 中的networkd3 包来绘制节点列表和链接(边缘列表)的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 和 在采样之前被零索引。

我还有一个节点列表,它有 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 示例,则输出符合预期。

【问题讨论】:

    标签: r d3.js plot graph networkd3


    【解决方案1】:

    我建议使用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)
    

    【讨论】:

    • 他的代码(在 simpleNetwork 之后)做了所需要的。您是正确的,解决方案是首先根据您传递的边缘列表创建节点列表,然后将两者传递给 forceNetwork 。只是一个小问题。在simpleNetwork(edgelist) 上,因为 df 不是按照预期的顺序显示的,所以它显示的图表有点错误。
    • 我修改了上面代码中的simpleNetwork命令...可以显式设置source和target的列名。
    • @CJYetman 工作就像一个魅力 - 非常感谢您的帮助:) 所以nodes 的索引(首先订购了原始的 4 位节点 ID,重置为零)用于编码source 和target id。那么target 中的source 中的值应该匹配`nodes` 上的重置id,不是(在这种情况下)原始数据采样中剩余的原始4 位id?跨度>
    • 链接数据框中源和目标中的值应该与它们在节点数据框中引用的节点的行/索引相匹配...但是由于它被传递给 JavaScript,JS 会查看第一个“行/索引”为 0,而不是像 R 一样的 1。
    • @CJYetman 再次嗨。只是一个后续问题 - 当您进行转换时,links 您的 value 默认为 1。我怎样才能使它等于edgelist 中的原始链接概率round_prob?谢谢
    【解决方案2】:

    我认为您应该对节点列表进行子集化,使其仅包含边缘列表中的节点。

    【讨论】:

    • 嗨克里斯托弗。我真诚地感谢您的回复。所以我试过了,但没有用。但是,我没有做的是在之后重置 edgelist 的节点列表的索引(即我有两者的一些子集,具有原始 ID 1097 1149 ... ,我需要“从 0 再次重置这些 ID。我将重新实施并回复您。再次衷心感谢您。
    • 嗨克里斯托弗。感谢@CJYetman,我能够让它工作。我认为,如果他没有回答,你的建议也会做得很好。非常感谢您的回复,以及编写这个包。祝你有美好的一天:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多