D3.js 使用d3 v4.0重新创建群集强制布局

D3.js 使用d3 v4.0重新创建群集强制布局,d3.js,D3.js,我试图使用D3V4重新创建集群强制布局,如下所示:。我重用了Mike代码中的cluster函数,但结果不太好()。此外,如果我传入了一个大于1的alpha参数,那么cx和cy将无法正确计算。有人能帮我一下吗 聚集气泡图 让边距={ 前100名, 右:100,, 底数:100, 左:100 }, 高度=窗内高度, 宽度=window.innerWidth, padding=1.5,//相同颜色节点之间的间隔 clusterPadding=6,//不同颜色节点之间的分隔 最大半径=12, n=2

我试图使用D3V4重新创建集群强制布局,如下所示:。我重用了Mike代码中的cluster函数,但结果不太好()。此外,如果我传入了一个大于1的alpha参数,那么cx和cy将无法正确计算。有人能帮我一下吗


聚集气泡图
让边距={
前100名,
右:100,,
底数:100,
左:100
},
高度=窗内高度,
宽度=window.innerWidth,
padding=1.5,//相同颜色节点之间的间隔
clusterPadding=6,//不同颜色节点之间的分隔
最大半径=12,
n=200,//节点总数
m=10,//不同簇的数目
z=d3.scaleOrdinal(d3.SchemeCategory 20),
集群=新阵列(m);
让svg=d3.select('body')
.append('svg')
.attr('height',height)
.attr('width',width)
.append('g').attr('transform','translate(${margin.right},${margin.top})`);
让节点=d3.range(200).map(()=>{
设i=Math.floor(Math.random()*m),
radius=Math.sqrt((i+1)/m*-Math.log(Math.random())*maxRadius,
d={
集群:我,
r:半径,
x:Math.random()*200,
y:Math.random()*200
};
如果(!clusters[i]|(radius>clusters[i].r))clusters[i]=d;
返回d;
});
let circles=svg.append('g')
.基准面(节点)
.selectAll(“.circle”)
.数据(d=>d)
.enter().append('圆')
.attr('r',(d)=>d.r)
.attr('cx',(d)=>d.x)
.attr('cy',(d)=>d.y)
.attr('fill',(d)=>z(d.cluster))
.attr('笔划','黑色')
.attr(“笔划宽度”,1);
让模拟=d3。力模拟(节点)
.velocityDecay(0.2)
力(“x”,d3.forceX().x(200)。强度(.5))
.力(“y”,d3.力().y(200).强度(.5))
.力(“碰撞”,d3.力碰撞().半径(函数d){
返回d.r+0.5;
}).强度(0.5).迭代次数(2))
.on(“勾选”,勾选)
//.力(“冲锋”,d3.力人体(100))
函数勾选(){
//设alpha=simulation.alpha();
圈子
.每个(聚类(0.5))
.attr('cx',(d)=>d.x)
.attr('cy',(d)=>d.y);
}
//将d移动到与群集节点相邻的位置。
函数聚类(alpha){
返回函数(d){
var cluster=簇[d.cluster];
if(cluster==d)返回;
var x=d.x-cluster.x,
y=d.y-cluster.y,
l=数学sqrt(x*x+y*y),
r=d.r+cluster.r;
如果(l!==r){
l=(l-r)/l*α;
d、 x-=x*=l;
d、 y-=y*=l;
簇x+=x;
簇y+=y;
}
};
}

我认为部分问题在于您使用的是新的4.0碰撞力,但您需要使用您复制的原始块的碰撞计算。以下是原始示例的一个端口:

希望有帮助