chart = {
const svg = d3.select(DOM.svg(width, height))
.style("width", "100%")
.style("height", "auto")
svg.append("path")
.datum(topojson.merge(london, london.objects.boroughs.geometries))
.attr("fill", "#ddd")
.attr("d", d3.geoPath(projection))
svg.append("path")
.datum(topojson.mesh(london, london.objects.boroughs, (a, b) => a !== b))
.attr("fill", "none")
.attr("stroke", "white")
.attr("stroke-linejoin", "round")
.attr("d", d3.geoPath(projection))
svg.append("g")
.attr("fill", "none")
.attr("stroke", "black")
.attr("pointer-events", "all")
.selectAll("path")
.data(d3.geoVoronoi().polygons(centroids).features)
.enter().append("path")
.attr("d", d3.geoPath(projection))
.append("title")
svg.append("path")
.datum({type:"FeatureCollection", features: centroids})
.attr("d", d3.geoPath(projection).pointRadius(1.5));
return svg.node()
}