chart = {
let w=500, h=400;
let animationSpeed = 2000;
let ease = d3.easeElasticOut.amplitude(1).period(0.3);
const svg = d3.create("svg");
return Object.assign(svg.node(), {input(dataIn) {
svg.attr("width", w).attr("height", h)
let dots = svg.selectAll("circle.dots")
.data(dataIn, d => d.key)
.join(
enter => enter
.append("circle")
.attr('class', d => 'dots' + ' ' + d.class)
.transition().duration(0)
.attr('cx', d => d.cx)
.attr('cy', d => d.cy)
.attr('r', 0 )
.transition().duration(animationSpeed).ease(ease)
.attr('r', d => d.r)
,
update => update
.attr('class', d => 'dots' + ' ' + d.class)
.transition().duration(animationSpeed).ease(ease)
.attr('cx', d => d.cx)
.attr('cy', d => d.cy)
.attr('r', d => d.r)
,
exit => exit
.transition().duration(animationSpeed).ease(ease)
.attr('r', 5)
.remove()
)
}})
}