{
const brushDelay = vl.selectInterval('delay').encodings('x');
const brushDist = vl.selectInterval('dist').encodings('x');
const brushTime = vl.selectInterval('time').encodings('x');
function hist(field, brush, crossfilter) {
const x = vl.x()
.fieldQ(field)
.bin({maxbins: 100, minstep: 1}).stack(false)
.axis({title: field, titleAnchor: 'start', format: 'd'});
return vl.layer(
vl.markBar().select(brush)
.encode(x, vl.detail().count(), vl.color().value('transparent')),
vl.markBar().transform(vl.filter(crossfilter))
.encode(x, vl.y().count().axis(null))
)
.width(width - 10)
.height(100);
}
return vl.vconcat(
hist('delay', brushDelay, vl.and(brushDist, brushTime)),
hist('distance', brushDist, vl.and(brushDelay, brushTime)),
hist('time', brushTime, vl.and(brushDelay, brushDist))
)
.data('data/flights-10k.json')
.transform(vl.calculate('hours(datum.date) + minutes(datum.date) / 60').as('time'))
.config({view: {stroke: null}})
.render();
}