chart = {
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height]);
const gx = svg.append("g")
.call(xAxis);
const gy = svg.append("g")
.call(yAxis);
svg.append("g")
.call(grid);
const circles =
svg.append("g")
.selectAll("circle")
.data(data, d => d.name)
.join("circle")
.attr("cx", d => x(d.povs))
.attr("cy", d => y(d.mean))
.attr("r", d => radiusScale(d.total))
.attr("stroke", "steelblue")
.attr("fill", "steelblue")
.attr("stroke-width", 0)
.attr("fill-opacity", 0.5)
.on("mouseover", tooltipMouseOver)
.on("mouseout", tooltipMouseOut);
const labels = svg.append("g")
.attr("font-family", "sans-serif")
.style('font-size', fontSize)
.selectAll("text")
.data(data)
.join("text")
.attr("dy", "0.35em")
.attr("x", d => x(d.povs) + radiusScale(d.total) + 7)
.attr("y", d => y(d.mean))
.text(d => d.name);
svg
.selectAll('text').style('font-size', fontSize)
return Object.assign(svg.node(), {
update(xAttribute, yAttribute, aAttribute) {
x.domain([0, d3.max(data, d => d[xAttribute])]);
y.domain([0, d3.max(data, d => d[yAttribute])]);
radiusScale.domain([0, d3.max(data, d => d[aAttribute])]);
const t = svg.transition()
.duration(750);
circles
.transition(t)
.delay((d, i) => i * 20)
.attr('r', d => radiusScale(d[aAttribute]))
.attr("cx", d => x(d[xAttribute]))
.attr("cy", d => y(d[yAttribute]))
labels
.transition(t)
.delay((d, i) => i * 20)
.attr('x', d => x(d[xAttribute]) + radiusScale(d[aAttribute]) + 7)
.attr('y', d => y(d[yAttribute]));
gx.transition(t)
.call(xAxis)
.selectAll(".tick")
.delay((d, i) => i * 20);
gy.transition(t)
.call(yAxis)
.selectAll(".tick")
.delay((d, i) => i * 20)
svg
.selectAll('text').style('font-size', fontSize)
}
});
}