首页 > 解决方案 > 在 cytoscape.js 中按度过滤节点

问题描述

我有一个 cytoscape.js 图,我想按度数过滤节点。例如,如果 node1 仅连接到 node2 和 node3 ,当我从过滤器中选择阈值 3 时,将删除所有少于 3 条边的节点。现在我有这个问题:

1)如何按度数过滤?我知道var collection = cy.elements("node[weight > 2]");选择一个集合cy.remove(collection);并将删除这些节点,但是如何按连接边数删除?

2)删除一些节点后,需要重新运行布局以获得更好的表示。我找到了一个解决方案,但它需要的时间大致与删除节点之前一样大。我测试了这段代码:

添加节点的代码:

    for (var i = 0; i < keys.length; i++) {
    try {

        cy.add({
                data: {
                    id: keys[i],
                    weight: i
                }
            }
        );
    }

布局代码:

var layout;
cy.ready(function () {
    layout = cy.layout({
        name: 'cose-bilkent',
        animate: false,
        padding: 100,
        nodeRepulsion: 20000,
        idealEdgeLength: 700,
        edgeElasticity: 10,
        numIter: 2500,
        initialEnergyOnIncremental: 0.01,
        ready: function () {
        }, // on layoutready
        stop: function () {
            cy.endBatch();
            var b64key = 'base64,';
            var b64 = cy.png().substring(cy.png().indexOf(b64key) + b64key.length);

            var imgBlob = b64toBlob(b64, 'image/png');
            saveAs(imgBlob, 'graph.png');


            alert(new Date().getTime() - n);
            n = new Date().getTime();
        }
    });
    layout.run();
});

在按钮上单击我运行这个:

    var collection = cy.elements("node[weight > 2]");
    cy.remove( collection );
    layout.run();

但是用 3 个节点加载这个图需要 37 秒!!!

标签: javascripthtmllayoutgraphcytoscape.js

解决方案


推荐阅读