chart = {
const wrapper = d3.select(DOM.element("div"));
const svg = wrapper.append("svg")
.attr("width", mapWidth)
.attr("height", mapHeight);
const g = svg.append("g");
const bar = svg.append("g")
.attr("class", "scale-bar-wrapper")
.call(scaleBarZoom);
svg.call(d3.zoom()
.scaleExtent([1, 10])
.translateExtent([[0, 0], [mapWidth, mapHeight]])
.on("zoom", event => {
const t = event.transform;
g.attr("transform", t);
scaleBarZoom.zoomFactor(t.k);
bar.call(scaleBarZoom);
})
);
g.selectAll("path")
.data(geoJsonUsa.features)
.enter().append("path")
.attr("fill", "#eee")
.attr("stroke", "#bbb")
.attr("d", d3.geoPath(projection));
let propCircles = g
.selectAll('circle')
.data(data)
.enter()
.append("circle")
.style("stroke", "black")
.style("stroke-width", 0.5)
.style("fill", "brown")
.style("opacity", "0.8")
.style("pointer-events", "none")
.attr("r", d => toRadius(d))
.attr("cx", d => {
if (d) {
if (d[date] > 0) {
let coordinates = [d.lng, d.lat];
return projection(coordinates)[0];
}
}
})
.attr("cy", d => {
if (d) {
if (d[date] > 0) {
let coordinates = [d.lng, d.lat];
return projection(coordinates)[1];
}
}
});
const legend = svg.append("g")
.attr("fill", "#777")
.attr("transform", "translate(915,608)")
.attr("text-anchor", "middle")
.style("font", "10px sans-serif")
.selectAll("g")
.data(circleScale.ticks(4).slice(1))
.join("g");
legend.append("circle")
.attr("fill", "none")
.attr("stroke", "#ccc")
.attr("cy", d => -circleScale(d))
.attr("r", circleScale);
legend.append("text")
.attr("y", d => -2 * circleScale(d))
.attr("dy", "1.3em")
.text(circleScale.tickFormat(4, "s"));
return wrapper.node();
}