В 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 –