chart = {
const svg = d3.create("svg")
.attr("viewBox", [-width/2.5, 0, width, height]);
svg.append("g")
.attr("stroke", "#999")
.attr("stroke-width", 1.5)
.selectAll("line")
.data(data.links)
.join("line")
.attr("x1", d => d.sourceX)
.attr("y1", d => d.sourceY)
.attr("x2", d => d.targetX)
.attr("y2", d => d.targetY);
svg.append("g")
.attr("stroke", "#fff")
.attr("stroke-width", 4)
.selectAll("circle")
.data(data.nodes)
.join("circle")
.attr("fill", "steelblue")
.attr("r", 10)
.attr("cx", d => d.x)
.attr("cy", d => d.y);
const interval = setInterval(function() {
const updatedData = randomisePosition(data);
svg.selectAll("circle")
.data(updatedData.nodes)
.transition()
.duration(500)
.ease(d3.easeCircleOut)
.attr("cx", d => d.x)
.attr("cy", d => d.y);
svg.selectAll("line")
.data(updatedData.links)
.transition()
.duration(500)
.ease(d3.easeCircleOut)
.attr("x1", d => d.sourceX)
.attr("y1", d => d.sourceY)
.attr("x2", d => d.targetX)
.attr("y2", d => d.targetY);
}, 1000);
return svg.node();
}