chart = {
var svg = d3.create('svg').attr('viewBox', [0, 0, width, height]);
var xAxis = d3.axisTop(xScale)(
svg.append('g').attr('transform', `translate(${0},${margin.top})`)
);
var yAxis = d3.axisLeft(yScale)(
svg.append('g').attr('transform', `translate(${margin.left},${0})`)
);
let visitIndex = 0;
let visit = visits[visitIndex];
var visitText = svg
.append('text')
.attr('x', margin.left)
.attr('dx', 4)
.attr('y', margin.top)
.attr('dy', 4)
.attr('alignment-baseline', 'hanging')
.text(visit);
measure.forEach(d => {
d.ARM = d[1][0].ARM;
d.datum = d[1].find(di => di.AVISIT === visits[visitIndex]);
d.pchg_bin = d.datum ? d.datum.pchg_bin : null;
});
var g = svg
.append('g')
.attr('transform', `translate(${margin.left},${margin.top})`);
var nodes = svg
.selectAll('circle')
.data(measure, d => d[0])
.join('circle')
.attr('r', radius)
.attr('fill', 'white')
.attr('stroke', d => colorScale(d.ARM));
var simulation = d3
.forceSimulation(measure)
.force('x', d3.forceX(d => xScale(d.pchg_bin) + xScale.bandwidth() / 2))
.force('y', d3.forceY(d => yScale(d.ARM) + yScale.bandwidth() / 2))
.force('collide', d3.forceCollide(radius));
simulation.on('tick', () => {
nodes
.filter(d => d.pchg_bin !== null)
.attr('cx', d => (d.x ? d.x : xScale(0) + xScale.bandwidth() / 2))
.attr('cy', d => (d.y ? d.y : yScale(d.ARM) + yScale.bandwidth() / 2));
});
return svg.node();
}