如何检查没有链接的节点的d3 js力图并删除它们?

Posted

技术标签:

【中文标题】如何检查没有链接的节点的d3 js力图并删除它们?【英文标题】:How to check d3 js force graph for nodes with no links and remove them? 【发布时间】:2012-10-07 02:46:06 【问题描述】:

我想控制我的节点,这样每个节点都是链接的,没有孤立的节点。

我的脚本每 30 秒从 json 查询中添加一对新节点。如果任何一个新节点是现有节点的副本,则图将仅使用唯一节点更新并将其链接到另一个现有节点。

在此过程中,我将移除最旧的节点以在图表上保留最多 10 个节点。正是在这里,我似乎遇到了麻烦。如何移除节点并检查并移除任何散乱的节点、未链接到任何其他节点的节点?

脚本基于on knoren's post on adding new nodes。

                this.checkLength = function () 
                    if (nodes.length > 10) 
                        var i = links.shift();
                        nodes.splice(findNodeIndex(i),1);
                        update();
                    
                 

【问题讨论】:

要删除未使用的节点,您应该在检查是否满足将节点保留在屏幕上的所有条件后,在更新函数中执行 node.exit().remove() 。在这种情况下真的很难说错误在哪里,因为您可能有添加/删除在几个函数之间拆分的节点的逻辑,并且您只显示其中一个......我想您应该只分配一个分数或其他东西每个节点更有可能停留在屏幕上,然后通过 score > x 或其他内容进行简单过滤......这只是一个想法,这就是为什么我将其作为评论而不是答案。 【参考方案1】:

按照 paxRoman 的建议,要删除节点,您可以这样做:

node.exit().remove();

现在,要查找空节点,您可以使用强制节点的weight 属性,如documentation of the force layout 中所述:

weight - 节点权重;关联链接的数量。

所以,最后,为了得到所有空的节点,你可以这样做:

force.nodes().filter(function(d)d.weight==0)

force 是你的部队布局。

还请注意,权重属性只会在force.start() 调用时初始化,如文档中所述:

在将节点传递给布局之前不需要设置这些属性;如果未设置,则在调用 start 时布局将初始化合适的默认值

【讨论】:

以上是关于如何检查没有链接的节点的d3 js力图并删除它们?的主要内容,如果未能解决你的问题,请参考以下文章

使用 D3.js 的层次力图

如何在 d3.js 中同时自动移动节点和链接

D3中力图节点内的圆形包装?

d3js,当鼠标拖动空白区域时,力图持续跳跃

使用 d3.js 保存和重新加载强制布局

D3.js 网络图使用力导向布局和矩形节点