d3 を使用して強制レイアウトを作成しましたが、うまく機能します。私の初期データは json ファイルから読み込まれ、グラフはこの d3.js の例と同様の手法で描画されます。
グラフが画面に表示されたので、Web ソケット経由で受け取ったデータからその場でノードを追加、更新、および削除する必要があります。add メソッドと remove メソッドは機能していますが、既存のノードのプロパティを更新する正しい方法が見つかりません。
私が行った読書から、データ ソースを変更し、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();
}
}
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);
}
})
}
私はこれに対して正しいアプローチを取っていますか?このコードを試してみると、円に半径属性を設定しようとしたときにデータとして取得したノードは、ノード配列の最後のノードです。つまり、単一のノード オブジェクトではなく、階層ノード データを含むものです。
どんなポインタでも大歓迎です、私はこれにあまりにも多くの時間を費やしました:)