chart_lollipop_sort_individually = {
const svg = d3.select(DOM.svg(width, height));
const groups = svg.append("g")
.selectAll("g.lollipop")
.data(rocketLaunchesTable).enter()
.append("g")
.attr("class", "lollipop")
.attr('transform', `translate(10, 0)`);
let scaleFactor = 20;
groups.append("rect")
.attr("x", d => xScale(d.name))
.attr("y", d => yScale(d.num_missions))
.attr("height", d => yScale(0) - yScale(d.num_missions))
.attr("width", xScale.bandwidth() / scaleFactor)
.attr("fill", bar_color)
let circleOffset = xScale.bandwidth() / (2 * scaleFactor);
groups.append("circle")
.attr("cx", d => xScale(d.name) + circleOffset)
.attr("cy", d => yScale(d.num_missions))
.attr("r", d => 5)
.attr("fill", bar_color)
.append("title")
.text(d => d.name);
svg.append("g")
.call(yAxis);
let sortAscending = false;
const sortingFunction = (a,b) => sortAscending ? d3.ascending(a.num_missions, b.num_missions)
: d3.descending(a.num_missions, b.num_missions);
svg.on('click', ()=> {
const t = d3.transition()
.duration(1500);
const perElementDelay = 50;
sortAscending = !sortAscending;
svg.selectAll('circle')
.sort(sortingFunction)
.transition(t)
.delay((d, i) => i * perElementDelay)
.attr('cx', (d, i) => xScaleSorted(i) + circleOffset );
svg.selectAll('rect')
.sort(sortingFunction)
.transition(t)
.delay((d, i) => i * perElementDelay)
.attr('x', (d, i) => xScaleSorted(i));
});
return svg.node();
}