function labels(svg) {
let label = svg.append("g")
.attr("text-anchor", "end")
.selectAll("text");
return ([date, data], transition) => label = label
.data(data.slice(0, n), d => d.name)
.join(
enter => enter.append("text")
.attr("transform", d => `translate(${x(0)},${y((prev.get(d) || d).rank)})`)
.attr("y", y.bandwidth() / 2)
.attr("x", 0)
.attr("dy", "0.35em")
.attr("font-size", y.bandwidth()>14? 14: y.bandwidth())
.attr('font-weight','bold')
.text(d => d.name.substring(0, d.name.length - 2))
.call(text =>
text.append("tspan").attr("dx", d=> ((prev.get(d) || d).value>0?(x((prev.get(d) || d).value)-x(0))+(y.bandwidth()>14? 12: y.bandwidth())*4:(x((prev.get(d) || d).value)-x(0))))
.attr("fill-opacity", 0.7)
.attr("font-size", y.bandwidth()>14? 14: y.bandwidth())
.attr('font-weight','bold')
.attr("x", 0)
.attr("dy", "0.1em")
),
update => update,
exit => exit.transition(transition).remove()
.attr("transform", d => `translate(${x(0)},${y((next.get(d) || d).rank)})`)
.call(g => g.select("tspan")
.attr("dx", d => (next.get(d) || d).value>0? (x((next.get(d) || d).value)-x(0))+(y.bandwidth()>14? 12: y.bandwidth())*4:(x((next.get(d) || d).value)-x(0)))
.attr("font-size", y.bandwidth()>14? 14: y.bandwidth())
.attr('font-weight','bold')
.tween("text", d => textTween(d.value, (next.get(d) || d).value)))
)
.call(bar => bar
.attr("transform", d => (prev.get(d)|n>100)?`translate(${x(0)},${y((prev.get(d) || d).rank)})`:`translate(${x(0)},${y(d.rank)})`)
.transition(transition)
.attr("transform", d => `translate(${x(0)},${y(d.rank)})`)
.attr("y", y.bandwidth() / 2)
.attr("font-size", y.bandwidth()>14? 14: y.bandwidth())
.attr('font-weight','bold')
.attr('x',0)
.call(g => g.select("tspan")
.attr("dx", d => d.value>0?(x(d.value)-x(0)+(y.bandwidth()>14? 12: y.bandwidth())*4):(x(d.value)-x(0)))
.tween("text", d => textTween((prev.get(d) || d).value, d.value))
.attr("font-weight", "bold")
.attr("font-size", y.bandwidth()>14? 14: y.bandwidth())
));
}