D3 フォース レイアウトで表示しようとしているデータがあります。これが素朴な質問である場合、または質問のタイトルで使用する用語が正確でない場合はお詫び申し上げます。私が探していた答えがまったく見つかりませんでした。
ここで私が何をしているのかを示すサンプルでフィドルを作りました:
http://jsfiddle.net/stevendwood/f3GJT/8/
この例では、多数のリンクを持つ 1 つのノード (0) があります。別のノード (16) のリンク数は少なく、0 と 16 は両方とも 15 に接続されています。
だから私が望むのは、0と16が小さなクラスターになり、接続されたノードがそれらの周りに素敵な円で表示されることです。
リンクの数に基づいて料金をカスタマイズしようと無駄に試みましたが、どうにかして、ノードが接続されているノードに引き付けられ、接続されていないノードに引き付けられないようにしたいと思います。
可能であれば、次のようなものが欲しいです。
var w = 500,
h = 500,
nodes = [],
links = [];
/* Fake up some data */
for (var i=0; i<20; i++) {
nodes.push({
name: ""+i
});
}
for (i=0; i<16; i++) {
links.push({
source: nodes[i],
target: nodes[0]
});
}
links.push({
source: nodes[16],
target: nodes[15]
});
for (i=17; i<20; i++) {
links.push({
source: nodes[i],
target: nodes[16]
});
}
var countLinks = function(n) {
var count = 0;
links.forEach(function(l) {
if (l.source === n || l.target === n) {
count++;
}
});
return count;
}
/////////////////////////////////////////////
var vis = d3.select("body").append("svg:svg")
.attr("width", w)
.attr("height", h);
var force = d3.layout.force()
.nodes(nodes)
.links([])
.gravity(0.05)
.charge(function(d) {
return countLinks(d) * -50;
})
.linkDistance(300)
.size([w, h]);
var link = vis.selectAll(".link")
.data(links)
.enter().append("line")
.attr("class", "link")
.attr("stroke", "#CCC")
.attr("fill", "none");
var node = vis.selectAll("circle.node")
.data(nodes)
.enter().append("g")
.attr("class", "node")
.call(force.drag);
node.append("svg:circle")
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", 14)
.style("fill", "#CCC")
.style("stroke", "#AAA")
.style("stroke-width", 1.5)
node.append("text").text(function(d) { return d.name; })
.attr("x", -6)
.attr("y", 6);
force.on("tick", function(e) {
node.attr("transform", function(d, i) {
return "translate(" + d.x + "," + d.y + ")";
});
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; })
});
force.start();