chart1b = {
const [domains] = aqData
.rollup({
x: d => [op.min(d.value), op.max(d.value)],
y: d => op.array_agg_distinct(d.age)
});
const x = xscale(domains.x);
const y = yscale(domains.y);
const svg = d3.create('svg').attr('viewBox', [0, 0, width, height]);
svg.append('g').call(xaxis(x));
svg.append('g').call(yaxis(y));
svg.append('g')
.attr('fill', 'steelblue')
.attr('stroke-width', 10)
.attr('pointer-events', 'all')
.selectAll('rect')
.data(aqData)
.join('rect')
.attr('x', d => x(d.value) - 0.75)
.attr('y', d => y(d.age))
.attr('width', 1.5)
.attr('height', y.bandwidth())
.append('title')
.text(d => `${d.name}\n${(d.value * 100).toFixed(1)}% ${d.age}`);
return svg.node();
}