使用 Cytoscape.js 在所有节点上执行中心函数
Perform Centrality Functions on all Nodes using Cytoscape.js
我需要计算图上每个节点的 degree、紧密度和介数中心性。在 cy.ready()
事件之后,我目前在每个节点上使用内置于 Cytoscape.js 中的函数。然而,由于图表非常大(250+ 个节点,650+ 个连接),计算时间太长。谁能推荐一个更有效的方法?
var calculateSNA = function() {
// Don't run if already set...
if(data.sna) return false
console.log('Running SNA')
_.map(nodes, function(node) {
var target = cy.nodes('#' + node.data.id)
node.data.sna = {
degreeCentrality: cy.$().dc({ root: target }).degree,
closenessCentrality: cy.$().cc({ root: target }),
betweennessCentrality: cy.$().bc().betweenness(target)
}
return node
})
// Add SNA data to local storage
Data.add({
sna: true
})
Node.set(nodes)
console.log('SNA complete')
}
cy.ready(function(event) {
console.log('cy.ready()')
calculateSNA()
})
运行算法一次,而不是运行它N次。然后直接查询结果:
let ccn = cy.elements().closenessCentralityNormalized({ /* my options */ });
cy.nodes().forEach( n => {
n.data({
ccn: ccn.closeness( n )
});
} );
除非您有充分的理由不这样做,否则请使用中心性算法的规范化版本。例如,如果您将一张图表中的结果与另一张图表中的结果进行比较,只有规范化版本才真正有意义。
我需要计算图上每个节点的 degree、紧密度和介数中心性。在 cy.ready()
事件之后,我目前在每个节点上使用内置于 Cytoscape.js 中的函数。然而,由于图表非常大(250+ 个节点,650+ 个连接),计算时间太长。谁能推荐一个更有效的方法?
var calculateSNA = function() {
// Don't run if already set...
if(data.sna) return false
console.log('Running SNA')
_.map(nodes, function(node) {
var target = cy.nodes('#' + node.data.id)
node.data.sna = {
degreeCentrality: cy.$().dc({ root: target }).degree,
closenessCentrality: cy.$().cc({ root: target }),
betweennessCentrality: cy.$().bc().betweenness(target)
}
return node
})
// Add SNA data to local storage
Data.add({
sna: true
})
Node.set(nodes)
console.log('SNA complete')
}
cy.ready(function(event) {
console.log('cy.ready()')
calculateSNA()
})
运行算法一次,而不是运行它N次。然后直接查询结果:
let ccn = cy.elements().closenessCentralityNormalized({ /* my options */ });
cy.nodes().forEach( n => {
n.data({
ccn: ccn.closeness( n )
});
} );
除非您有充分的理由不这样做,否则请使用中心性算法的规范化版本。例如,如果您将一张图表中的结果与另一张图表中的结果进行比较,只有规范化版本才真正有意义。