我有一个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秒!!!