this codepen demoをご覧ください。私はsvgオブジェクトをクリックして、シミュレーションチックがインスタンス化されていることを確認してください。したがって、遷移が発生します。私は単純な関数を使用してそれを行う:d3js v4:ノードにクリックを強制してトゥイーンのように見えるようにするにはどうすればよいですか?
しかし、 "トゥイーン"が存在しないことをデモから見ることができます。私が提案しているトゥイーンの例を見るには、hereを参照してください!
どこが間違っていますか? ticked()
関数はノードがどこにあるか知っていますか?ノードの代わりにシミュレーションにポジションを指定する必要がありますか?
キーコード(上記のデモリンクに含まれる):
var data = {
nodes:d3.range(0, range).map(function(d){ return {label: "l"+d ,r: config.radius,color: d3.scaleOrdinal(d3.schemeCategory10)}})
}
svg
.attr("width", config.canvas.width)
.attr("height", config.canvas.height)
.attr("id", "canvas")
.style("border", "1px solid black")
.attr("onclick", "transitionTo()");
}
var simulation = d3.forceSimulation()
.force("collide",d3.forceCollide(function(d){return d.r + 1 }).iterations(15))
.force("charge", d3.forceManyBody().strength(1))
.force("center", d3.forceCenter(config.canvas.width/2, config.canvas.height/2))
.force("y", d3.forceY(0))
.force("x", d3.forceX(0));
var node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(data.nodes)
.enter().append("circle")
.attr("r", function(d){ return d.r })
.attr('cx', function(d, i) { return i % 10 * (config.canvas.width - config.margin.x*2)/10 + config.radius + config.margin.x; })
.attr('cy', function(d, i) {return (Math.floor(i/10) * (config.canvas.height - config.margin.y*2)/10) + config.margin.y + config.radius});
var ticked = function() {
node
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}
simulation
.nodes(data.nodes);
function transitionTo() {
simulation
.on("tick", ticked);
}
私はD3 v4のためにある答えを好むが、任意のアイデアは非常に歓迎されるでしょう!このd3 noobのおかげで。