function* chart(data = []) {
const margin = {left: 40, right: 10, top: 10, bottom: 20}
const w = Math.min(640, width) - margin.left - margin.right;
const h = 300 - margin.top - margin.bottom;
const x = d3.scaleBand()
.domain(d3.range(400, 601))
.range([0, w])
const y = d3.scaleLinear()
.domain([0, data.length ? d3.max(data, ([_, entries]) => entries.length) : 1])
.range([h, 0]);
const svg = d3.create("svg")
.attr("width", w + margin.left + margin.right)
.attr("height", h + margin.top + margin.bottom)
const g = svg.append("g")
.attr("transform", `translate(${[margin.left, margin.top]})`)
const yticks = g.append("g")
.attr("transform", `translate(${w})`)
.call(d3.axisLeft(y).tickSize(w).tickFormat(d => ""))
yticks.selectAll("line").attr("stroke", "#eee")
yticks.select(".domain").remove()
const xvals = d3.range(400, 625, 25);
const xticks = g.append("g")
.call(d3.axisBottom(x).tickValues(xvals).tickSize(h).tickFormat(d => ""))
xticks.selectAll("line").attr("stroke", "#eee")
xticks.select(".domain").remove()
g.append("g")
.call(d3.axisLeft(y).tickSizeOuter(0))
g.append("g")
.attr("transform", `translate(0, ${h})`)
.call(d3.axisBottom(x).tickSizeOuter(0).tickValues(xvals))
const bars = g.selectAll(".bar")
.data(data)
.join("rect")
.attr("class", "bar")
.attr("fill", "steelblue")
.attr("stroke", "steelblue")
.attr("x", ([flips]) => x(flips))
.attr("y", ([_, entries]) => y(entries.length))
.attr("width", x.bandwidth())
.attr("height", ([_, entries]) => h - y(entries.length))
yield svg.node()
}