pc_brush = (scatterplot_group, pcp_data_group, pcp_pc_group) => {
let brush_pad = 8
let data_brush = d3.brushY().extent([[-brush_pad,0],[brush_pad,pcp_size]])
pcp_data_group.selectAll('guides').data(att_order).enter().append('g').attr('class', 'dataguide')
.attr('transform', d => 'translate('+(attribute_scale(d))+','+(0)+')').raise()
data_brush.on('brush', att => {
let rect_select = d3.event.selection;
let min_att = pcp_data_scale[att].invert(rect_select[1]);
let max_att = pcp_data_scale[att].invert(rect_select[0]);
let brushed_data = nba_data.filter(d => {
return d[att] >= min_att && d[att] <= max_att
});
linked_updates(brushed_data, scatterplot_group, pcp_data_group, pcp_pc_group)
})
.on('end', () => {
pcp_data_group.selectAll('.selection,.handle').attr('style', 'display: none;')
})
let pc_brush = d3.brushX().extent([[0,-brush_pad],[pcp_size,brush_pad]])
pcp_pc_group.selectAll('guides').data(pc_order).enter().append('g').attr('class', 'pcguide')
.attr('transform', d => 'translate('+(0)+','+(pc_scale(d))+')').raise()
pc_brush.on('brush', pc => {
let rect_select = d3.event.selection;
let min_att = pcp_pcs_scale[pc].invert(rect_select[0]);
let max_att = pcp_pcs_scale[pc].invert(rect_select[1]);
let brushed_data = nba_data.filter(d => {
return d[pc] >= min_att && d[pc] <= max_att
});
linked_updates(brushed_data, scatterplot_group, pcp_data_group, pcp_pc_group)
})
.on('end', () => {
pcp_pc_group.selectAll('.selection,.handle').attr('style', 'display: none;')
})
pcp_data_group.selectAll('.dataguide').call(data_brush)
pcp_pc_group.selectAll('.pcguide').call(pc_brush)
}