viz = {
const svg = d3.create("svg").attr("width", width).attr("height", height);
svg
.append("rect")
.attr("x", 0)
.attr("y", 0)
.attr("width", width)
.attr("height", height)
.attr("fill", bgColor);
for (let i = 0; i < birthData.length; i++) {
const bd = birthData[i];
svg
.append("rect")
.attr("width", rectWidth - internalMargin)
.attr("height", rectHeight - internalMargin)
.attr("x", dayScale(bd.date) + internalMargin / 2)
.attr("y", monthScale(bd.month - 1) + internalMargin / 2)
.attr("fill", d3.interpolateViridis(birthParameterScale(bd.births)));
}
for (let i = 0; i < monthLabels.length; i++) {
const month = monthLabels[i];
svg
.append("text")
.text(month)
.attr("x", margin - labelOffset)
.attr("y", monthScale(i) + 0.5 * rectHeight)
.attr("fill", "white")
.attr("alignment-baseline", "middle")
.attr("text-anchor", "end")
.style("text-transform", "uppercase")
.attr("font-family", font)
.attr("font-size", labelFontSize);
}
for (let i = 1; i < 32; i++) {
svg
.append("text")
.text(i)
.attr("x", dayScale(i) + rectWidth / 2)
.attr("y", margin - labelOffset)
.attr("fill", "white")
.attr("font-family", font)
.attr("font-size", labelFontSize)
.attr("text-anchor", "middle");
}
svg
.append("text")
.text(" Daily US Births, 1995-2014")
.attr("x", width - margin)
.attr("y", margin / 2)
.attr("fill", "white")
.attr("font-family", font)
.attr("text-anchor", "end");
for (let i = 0; i < legendSteps.length; i++) {
svg
.append("rect")
.attr("width", legendSize)
.attr("height", legendSize)
.attr("x", i * legendSize + margin)
.attr("y", margin / 2 - legendSize / 4)
.attr("fill", d3.interpolateMagma(legendSteps[i]));
svg
.append("text")
.text(
birthParameterScale
.invert(legendSteps[i])
.toLocaleString(undefined, { maximumFractionDigits: 0 })
)
.attr("x", i * legendSize + margin + legendSize * 0.5)
.attr("y", margin / 2 - legendSize / 2)
.attr(
"transform",
`rotate(-45 ${i * legendSize + margin + legendSize * 0.5} ${
margin / 2 - legendSize / 2
})`
)
.attr("font-family", font)
.attr("font-size", labelFontSize)
.attr("fill", "white");
}
return svg.node();
}