d3 を使用してソーシャル ネットワーク グラフを視覚化しようとしています。強制レイアウト方式を使用しています。私がやりたいことは、ユーザーがグラフ内のノードを選択し、選択したノードに基づいて、他のノードの属性を変更する python スクリプトを実行できるようにすることです。そして、その変化を動的にグラフに反映させたい。最初の部分では、php を使用して python ファイルを実行し、更新されたノード属性で新しい json ファイルを作成しています。しかし、このファイルを動的にロードして、レイアウトを同じに保ち、変更を反映する方法がわかりません。どんな助けでも大歓迎です。
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.node {
stroke: #fff;
stroke-width: 1.5px;
}
.link {
stroke: #999;
stroke-opacity: .6;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<div id="button">
<input name="RumourSource" type="button" value="Source" onclick="SelectSource()" />
<input name="InfoFlow" type="button" value="Info" onclick="UpdateData()" />
</div>
<script>
var width = 1500,
height = 1500;
var color = d3.scale.category20();
var force = d3.layout.force()
.charge(-120)
.linkDistance(30)
.size([width, height]);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var link;
var node;
d3.json("data.json", function (graph) {
force
.nodes(graph.nodes)
.links(graph.links)
.friction(0.5)
.start();
link = svg.selectAll(".link")
.data(graph.links)
.enter().append("line")
.attr("class", "link")
.style("stroke-width", function(d) { return Math.sqrt(d.value); });
node = svg.selectAll(".node")
.data(graph.nodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", 5)
.style("fill", function(d) {
if (d.group == 1){
return "red"
}
else{
return "blue"
}
})
.on("mouseover", function(){d3.select(this).style("fill", "magenta");})
.on("mouseout", function(){d3.select(this).style("fill", "blue");})
.on("click", function(d){
console.log(d.name);
$.get("run_rumour_source.php", {sourceNode:d.name}, function(data,status){console.log("Data: "+ data + "\nStatus: " + status);}
);
d3.select(this)
.transition()
.delay(1000)
.duration(1000)
.style("fill", "magenta");
updateData(node)
<!-- .call(force.drag); -->
})
node.append("title")
.text(function(d) { return d.name; });
force.on("tick", function() {
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
}
);
function updateData(node){
force.stop();
d3.selectAll(".node").remove();
d3.selectAll(".link").remove();
var filename = "data1.json"
var node1;
var link1;
d3.json(filename, function(g){
force
.nodes(g.nodes)
.links(g.links);
console.log(g.nodes)
node1 = svg.selectAll(".node")
.data(g.nodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", 5)
.transition()
.duration(1000)
.style("fill", function(d) {
if (d.group == 1){
return "red"
}
else{
return "blue"
}
}
);
link1 = svg.selectAll(".link")
.data(g.links)
.enter().append("line")
.attr("class", "link")
.style("stroke-width", function(d) { return Math.sqrt(d.value); });
}
);
force.on("tick", function() {
link1.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node1.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
force.start();
}
</script>