我已經使用d3創建了一個強制佈局,並且效果很好。我最初的數據是從JSON文件加載和圖表繪製類似於this d3.js example技術:在d3 Force Layout中更新現有節點
現在,該圖是我需要補充,更新和刪除節點上的屏幕上從我通過網絡套接字接收的數據飛行。我有添加和刪除方法的工作,但我找不到更新現有節點的屬性的正確方法。
從我所進行的閱讀中我收集了正確的技術是更改數據源,然後使用enter()方法更新圖表。
要更新我在做一個節點如下:
function updateNode(id, word, size, trend, parent_id){
var updateNode = nodes.filter(function(d, i) { return d.id == id ? this : null; });
if(updateNode[0]){
updateNode.size = Number(size);
updateNode.trend = trend;
nodes[updateNode.index] = updateNode;
update();
}
}
然後更新功能與更新的節點:
function update(){
node = vis.selectAll('.node')
.data(nodes, function(d) {
return d.id;
})
createNewNodes(node.enter());
node.exit().remove();
force.start();
}
function createNewNodes(selection){
var slct = selection.append('g')
.attr('class', 'node')
.call(force.drag);
slct.append('circle')
.transition()
.duration(500)
.attr('r', function(d) {
if(d.size){
return Math.sqrt(sizeScale(d.size)*40);
}
})
}
我是否採取正確的方法呢?當我嘗試這段代碼時,我試圖在圓上設置radius屬性時獲得的節點是節點數組中的最後一個節點。即包含分層節點數據而不是單個節點對象的數據庫。
任何指針將不勝感激,我已經花了太多時間在這:)
我有同樣的問題,雖然在一個更簡單的環境。你找到解決方案嗎? – 2013-03-01 14:27:53
可以把你的代碼放到在線編輯器中,例如http://phrogz.net/JS/d3-playground/#BlankDefault – ppoliani