在带有强制模块的D3 v4中,如何在初始化图形后更新模拟参数?D3-Force在初始化图形后更新参数
更准确地说,当用户点击其中一个节点时,我试图改变强制有向图的.forceLink
和.forceManyBody
。
var node = svg
.append("g")
.attr("class", "gnodes")
.selectAll(".node")
.data(graph.nodes)
.enter()
.append("g")
.attr("class", "node")
.on('dblclick', connectedNodes); //calls for change in simulation parameters
到目前为止,我已经能够通过下connectedNodes功能复制模拟更新:
function connectedNodes() {
//new parameters
linkDistance = 5;
fCharge = -10;
//replicates the initial simulation code
simulation = d3.forceSimulation()
.force("link", d3.forceLink()
.id(function(d) {return d.id;})
.distance(linkDistance)
)
.force("collide", d3.forceCollide()
.radius(function(d){return d.r + 10})
.strength(1)
)
.force("charge", d3.forceManyBody()
.strength(fCharge)
)
.force("center", d3.forceCenter(width/2, height/2));
simulation.nodes(graph.nodes).on("tick", ticked);
simulation.force("link").links(graph.links);
虽然这个工程是非常多余。有没有一种方法可以用新参数来刷新模拟?我尝试了以下方法但不起作用
function connectedNodes() {
//new parameters
linkDistance = 5;
fCharge = -10;
//restart simulation with new parameters
simulation.restart();
}
任何对此感兴趣的人都应该看到这个令人敬畏的演示,它完成了所有图形力变量:https://bl.ocks.org/steveharoz/8c3e2524079a8c440df60c1ab72b5d03 –