这个问题是对前一个题为"初始化图形后D3强制更新参数"(初始化图形后的 D3- 强制更新参数)和@altocumulus回答的后续问题的后续跟进.
我试图在修改一些节点的半径后更新模拟力.但是,当我打电话forceCollide来考虑更改时,它不起作用.
图形首先正确启动,使用forceCollide和函数使力与半径对应:
var forceCollide = d3.forceCollide()
.radius(function(d){return d.radius;})
.iterations(2)
.strength(0.95);
var simulation = d3.forceSimulation()
.velocityDecay(velocityDecay)
.force("collide", forceCollide);
Run Code Online (Sandbox Code Playgroud)
然后我修改d.radius对象并想要forceCollide反映更改.但是,当我forceCollide再次打电话时,它不起作用:
forceCollide.radius(function(d){
d.radius;})
Run Code Online (Sandbox Code Playgroud)
有关为什么会发生这种情况的任何想法?
在带有强制模块的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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经能够通过在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);
Run Code Online (Sandbox Code Playgroud)
虽然这是有效的,但它非常多余.有没有一种方法可以使用新参数刷新模拟?我尝试了以下但它不起作用
function connectedNodes() …Run Code Online (Sandbox Code Playgroud)