function labels(svg) {
let label = svg.append("g")
.style("font", "bold 13px var(--sans-serif)")
.style("font-variant-numeric", "tabular-nums")
.attr("text-anchor", "end")
.selectAll("g");
return ([date, data], transition) => label = label
.data(data.slice(0, n), d => d.name)
.join(
enter => enter.append("g")
.attr("transform", d => `translate(${x((prev.get(d) || d).value)},${y((prev.get(d) || d).rank)})`)
.call(g => g.append("image")
.attr("y", (y.bandwidth() - 23) / 2)
.attr("x", -30)
.attr("width", 23)
.attr("height", 23)
.attr("xlink:href", d => imageByName.get(d.name)))
.call(g => g.append("text")
.attr("y", y.bandwidth() / 2)
.attr("x", -54)
.attr("dy", "-0.25em")
.text(d => d.name)
.append("tspan")
.attr("fill-opacity", 0.7)
.attr("font-weight", "normal")
.attr("x", -54)
.attr("dy", "1.15em")),
update => update,
exit => exit.transition(transition).remove()
.attr("transform", d => `translate(${x((next.get(d) || d).value)},${y((next.get(d) || d).rank)})`)
.call(g => g.select("tspan").tween("text", d => textTween(d.value, (next.get(d) || d).value)))
)
.call(bar => bar.transition(transition)
.attr("transform", d => `translate(${x(d.value)},${y(d.rank)})`)
.call(g => g.select("tspan").tween("text", d => textTween((prev.get(d) || d).value, d.value))));
}