chart = {
const svg = d3.select(DOM.svg(width, height));
const displayGroup = svg.append('g').attr('id', 'displayGroup');
const mapGroup = displayGroup.append('g').attr('id', 'mapGroup');
mapGroup.selectAll('path')
.data(geoData.features)
.enter()
.append('path')
.attr("id", function (d) {
return d.properties['NAME'];
})
.attr('d', geoGenerator);
const dataGroup = displayGroup.append('g').attr('id', 'dataGroup');
const points = dataGroup.selectAll('circle')
.data(cutUniData)
.enter()
.append('circle')
.attr('cx', function (d) { return d.projected_x; })
.attr('cy', function (d) { return d.projected_y; })
.attr('r', function (d) { return radiusScale(Math.sqrt(d.total)); })
.attr('id', function (d) { return d.css_id; });
var simulation = d3.forceSimulation(cutUniData)
.force('collide', d3.forceCollide().radius(function (d) { return d.radius + 1; }))
.force('cluster', forceCluster())
.on('tick', function () {
dataGroup.selectAll('circle')
.attr('cx', function (d) { return d.x; })
.attr('cy', function (d) { return d.y; });
});
hover(points, invalidation);
return svg.node();
}