【发布时间】:2016-08-17 11:49:15
【问题描述】:
在带有 force 模块的 D3 v4 中,初始化图形后如何更新模拟参数?
更准确地说,当用户单击其中一个节点时,我正在尝试更改力有向图的 .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();
}
【问题讨论】:
-
任何对此感兴趣的人都应该看到这个很棒的演示,它为所有图形力变量完成了它:bl.ocks.org/steveharoz/8c3e2524079a8c440df60c1ab72b5d03
标签: d3.js force-layout