radiusLegend = (g, scale, title) => {
const fontSize = 10;
const margin = {
top: 30,
bottom: 30,
left: 30,
right: 30
};
const numCircles = Math.min(4, Math.ceil((scale.range()[1] * 2) / fontSize));
const r = d3.range(numCircles);
const s = d3
.scaleLinear()
.domain([r[0], r[r.length - 1]])
.range(scale.domain());
g.attr('font-size', `${fontSize}px`);
g.selectAll('g')
.data(r)
.join(enter => {
const g = enter.append('g');
g.append('circle')
.attr('cx', margin.left + 50)
.attr('cy', d => margin.top + scale(s(d)))
.attr('r', d => scale(s(d)))
.attr('stroke', 'black')
.attr('fill', 'none');
g.append('line')
.attr('x1', margin.left + 50)
.attr('x2', margin.left + 80)
.attr('y1', d => margin.top + 2 * scale(s(d)))
.attr('y2', d => margin.top + 2 * scale(s(d)))
.attr('stroke', 'gray');
g.append('text')
.attr('x', margin.left + 84)
.attr('y', d => margin.top + 5 + 2 * scale(s(d)))
.text(d => Math.round(s(d)));
return g;
});
g.append('text')
.text(title)
.attr('y', margin.top + 2 * scale(s(numCircles - 1)) + 18)
.attr('x', margin.left + 60)
.attr('text-anchor', 'middle');
}