这个问题是上一个题为“初始化图形后 D3-Force 更新参数”( D3-Force updating parameters after initializing graph )的后续问题,@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);
然后我修改
d.radius
对象并希望 forceCollide
反射(reflect)更改。但是,当我再次调用 forceCollide
时它不起作用:forceCollide.radius(function(d){
d.radius;})
关于为什么会发生这种情况的任何想法?
最佳答案
这实际上不会更新半径。您只是重新设置用于确定半径的回调,与以前相比,它甚至没有改变。即使它确实发生了变化,这也不会触发您的更新,因为不会根据您更新的数据重新评估半径。
当更新链接力的距离回调时,力本身将被初始化。查看 source 显示了对 initializeDistance()
的调用:
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance;
};
这同样适用于其他力的参数的许多其他更新。
然而,查看 collide 力的来源,人们注意到没有调用初始化:
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), force) : radius;
};
由于您的回调不会改变,因此您无需再次调用
forceCollide.radius()
。相反,你需要打电话forceCollide.initialize(simulation.nodes());
这将根据您更新的数据重新评估半径。
关于d3.js - d3-force 初始化图后 forceCollide 的更新半径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39043121/