{
const svg = d3
.create("svg")
.attr("width", w)
.attr("height", h);
svg
.selectAll("rect")
.data(dataset)
.join("rect")
.attr("x", (d, i) => xScale(i))
.attr("y", d => h - yScale(d[1]))
.attr("width", xScale.bandwidth())
.attr("height", d => yScale(d[1]))
.attr("fill", d => color(d[1]))
.on("click", () => sortBars(svg));
svg
.selectAll("text")
.data(dataset)
.join("text")
.text(d => d[0])
.attr("text-anchor", "end")
.attr('transform', (d, i) => {
return (
'translate( ' +
(xScale(i) + xScale.bandwidth() / 2) +
' , ' +
(h - yScale(d[1]) + 5) +
'),' +
'rotate(-90)'
);
})
.attr("x", "0")
.attr("dy", "0.25em")
.attr("y", "0")
.attr("font-family", "sans-serif")
.attr("font-size", "11px")
.attr("fill", d => (d[1] > 2 ? "white" : "black"));
let sortOrder = false;
const sortBars = svg => {
sortOrder = !sortOrder;
svg
.selectAll("rect")
.sort((a, b) =>
sortOrder ? d3.ascending(a[1], b[1]) : d3.descending(a[1], b[1])
)
.transition()
.delay((d, i) => i * 50)
.duration(1000)
.attr("x", (d, i) => xScale(i));
svg
.selectAll("text")
.sort((a, b) =>
sortOrder ? d3.ascending(a[1], b[1]) : d3.descending(a[1], b[1])
)
.transition()
.delay((d, i) => i * 50)
.duration(1000)
.text(d => d[0])
.attr("text-anchor", "end")
.attr('transform', (d, i) => {
return (
'translate( ' +
(xScale(i) + xScale.bandwidth() / 2) +
' , ' +
(h - yScale(d[1]) + 5) +
'),' +
'rotate(-90)'
);
})
.attr("x", "0")
.attr("dy", "0.25em")
.attr("y", "0");
};
return svg.node();
}