删除单个或具有二度visjs的节点

时间:2017-06-08 14:21:45

标签: vis.js vis.js-network

我有一个网络图io::Write

现在我有一些连接节点,你可以看到大多数节点只有一个连接节点,它们的度数是1.现在我想删除这些节点以清除混乱。自从过去2天以来无法找到。 visjs文档中没有这样的辅助函数。非常感谢帮助。

2 个答案:

答案 0 :(得分:2)

我相信第一个答案-by macramole-(更新前)建议的算法实际上会隐藏未连接的节点(0度),而不是1度的节点。 我可能只是迭代网络中的所有边缘,同时保持每个节点的“度”计数器,这是您正在访问的边缘中的端点(您可以通过抓取edge.from和edge.to值来获取这些节点,如如上所示)。每当节点在此搜索中通过边缘“命中”时,您将增加节点的度数计数器。 最终,您将获得网络中每个节点的度数值,此时您可以决定隐藏哪些节点。 现在更新此答案以包含我建议的代码(注意:节点和边是可见的DataSet实例):

示例代码:

var nodeToDegrees = {}; // keeps a map of node ids to degrees
var nodeFrom, nodeTo;
for (edge in edges) {
    nodeFrom = edge.from;
    nodeTo = edge.to;
    nodeToDegrees[nodeFrom] = nodeToDegrees[nodeFrom] ? nodeToDegrees[nodeFrom] + 1 : 0;
    nodeToDegrees[nodeTo] = nodeToDegrees[nodeTo] ? nodeToDegrees[nodeTo] + 1 : 0;
}
for (node in nodes) {
    if (nodeToDegrees[node.id] = 1) nodes.update([{node.id, hidden: true}]);
}

答案 1 :(得分:0)

这可能有效:

var DEGREES_HIDDEN = 1;

for ( var node of nodes ) {
    node.cantLinks = 0;

    for ( var link of links ) {
        if ( link.from == node.id || link.to == node.id ) {
            node.cantLinks++;
        }
    }
}
for ( var node of nodes ) {
   if ( node.cantLinks <= DEGREES_HIDDEN ) {
       node.hidden = true;
   }  
}

节点和链接是数组而不是vis.DataSet,我在完成后创建了后者。

看起来并不是很好,但它确实完成了工作。希望你觉得它很有用。