我正在创建一个与多个滑块相关联的 D3 力导向可视化。当滑块输入改变时,变量 cx 和 cy 改变,节点移动到指定位置。这目前正在工作,但不是从初始位置过渡到下一个位置,而是节点“刷新”并从窗口左上角的新起始位置移动(丑陋)。这是我的可视化代码:
const simulation = d3.forceSimulation(data)
.force("charge", d3.forceManyBody().strength(5))
.force('collision', d3.forceCollide().radius(3))
.force("y", d3.forceY(function(d) { return d.cy*height; }).strength(0.1))
.force("x", d3.forceX(function(d) { return d.cx*width; }).strength(0.1));
const g = svg.selectAll('g.node')
.data(simulation.nodes())
.join('g')
.attr('class', 'node')
.call( g => g
.append('circle')
.attr('r', 2)
.attr('fill', function(d) { return d.budget_color; }));
simulation.on("tick", () => g.attr('transform', d => `translate(${ d.x },${ d.y })`) )
我还应该注意,我是通过 R shiny 运行它的,并且数据集是通过 r2d3 包与 JS 共享的。我在以下链接中找到了一些类似的主题,但无法使更改生效。
这是我尝试实现上述(使用'shiny:inputchanged')来检测滑块何时更新为闪亮,但我没有让它工作。
$(document).on('shiny:inputchanged', function(d) {
console.log("Input changed!");
simulation
.alpha(0.5)
.alphaTarget(0.3)
.restart();
simulation.force("x").initialize(data);
simulation.force("y").initialize(data);
simulation.force("collision").initialize(data);
})