Javascript d3.js压缩组件的链接

Javascript d3.js压缩组件的链接,javascript,d3.js,Javascript,D3.js,我试图在d3中的力定向布局图中选择一组节点,然后压缩节点形成的组件。我的想法是做一个力模拟,如下所示: var simulation = d3.forceSimulation() .force("link", d3.forceLink().distance(function(d) { return d.distance; }).strength(0.5)) .force("charge"

我试图在d3中的力定向布局图中选择一组节点,然后压缩节点形成的组件。我的想法是做一个力模拟,如下所示:

var simulation = d3.forceSimulation()
        .force("link", d3.forceLink().distance(function(d) {
            return d.distance;
        }).strength(0.5))
        .force("charge", d3.forceManyBody())
        .force("center", d3.forceCenter(width / 2, height / 2));
因为它依赖于距离,所以我想在图的数据中找到并选择适当的链接并缩小它,比如

graph_data.links[indx].distance = 0;
会压缩它。当我考虑这个问题时,我必须用这些新数据以某种方式刷新图表。但是,这并不理想,因为我不希望每次选择组件时图形都重建自身。有没有一种方法可以改变这些距离,而不必向重新绘制的图形输入新修改的数据,例如直接在模拟图形中选择链接而不是传递的数据

但是,这并不理想,因为我不希望每次选择组件时图形都重建自己

您实际上不必这样做,只需更新数据并重新启动模拟:


var svg=d3。选择('svg'),
宽度=+svg.attr('width'),
高度=+svg.attr('height');
风险值数据={
节点:[
{id:'a'},
{id:'b'},
{id:'c'},
{id:'x'},
{id:'y'},
{id:'z'},
],
链接:[
{源:'a',目标:'b',距离:200},
{源:'b',目标:'c',距离:200},
{源:'c',目标:'a',距离:200},
{源:'x',目标:'y',距离:200},
{源:'y',目标:'z',距离:200},
{源:'z',目标:'x',距离:200},
],
};
var模拟=d3
.forceSimulation()
.武力(
“链接”,
d3
.forceLink()
.id((d)=>d.id)
.距离(功能(d){
返回d.距离;
})
.强度(0.5)
)
.force('charge',d3.forceManyBody())
.力(“中心”,d3.力中心(宽度/2,高度/2));
var-link=svg
.append('g')
.attr('class','links'))
.selectAll('行')
.数据(数据链接)
.输入()
.append('行')
.attr(“笔划”、“黑色”);
var node=svg
.append('g')
.attr('类','节点')
.selectAll('圆圈')
.data(data.nodes)
.输入()
.append('圆')
.attr('cx',宽度/2)
.attr('cy',高度/2)
.attr('r',20)
.on('点击')功能(e、d){
link.data().forEach(函数(l){
if(l.source.id==d.id | | l.target.id==d.id){
l、 距离=0;
}否则{
l、 距离=200;
}
});
//重新绑定数据
模拟.force('link').links(数据.links);
//重启模拟
simulation.alpha(1.restart();
});
模拟.nodes(data.nodes).on('tick',ticked);
模拟.force('link').links(数据.links);
函数勾选(){
node.attr('cx',(d)=>d.x).attr('cy',(d)=>d.y);
链接
.attr('x1',(d)=>d.source.x)
.attr('y1',(d)=>d.source.y)
.attr('x2',(d)=>d.target.x)
.attr('y2',(d)=>d.target.y);
}