chart = {
const nodes = nodesData.map(d => Object.create(d));
const forceX = d3.forceX((d) => {
const position = d.group === "user" ? -100 : 100;
return position;
}).strength(0.15)
const forceY = d3.forceY(height/2).strength(0.015)
const simulation = d3.forceSimulation(nodes)
.force("x", forceX)
.force("y", forceY)
.force("collide", d3.forceCollide().radius(circleRadius).iterations(5))
.force("center", d3.forceCenter(width / 2, height / 2));
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height]);
const node = svg.append("g")
.selectAll(".node")
.data(nodes)
.join("g")
.attr('class', 'node')
.call(drag(simulation));
node.append('circle')
.attr("r", circleRadius)
.style("fill", (d, i) => {
return color(d.group);
});
simulation.on("tick", () => {
node
.attr("transform", d => `translate(${d.x}, ${d.y})`);
});
invalidation.then(() => simulation.stop());
return svg.node();
}