chart = {
const svg = d3.create("svg")
.attr("viewBox", [-width/2, -height/2, width, height]);
let backgroundBar = svg.append("g").append("path")
.datum({endAngle: r.range()[1]})
.attr("d", drawBar)
.classed("bar-background", true);
let ticksData = c.domain()
.map((e, i) => {
return {value: e, index: i, startAngle: r(e), endAngle: r(e)};
});
let ticks = svg.append("g")
.selectAll("path")
.data(ticksData)
.join("path")
.attr("d", drawTick)
.classed("tick", true)
.attr("stroke-width", tickStrokeWidth);
let foregroundBar = svg.append("g").append("path")
.datum({
value: r.domain()[0],
endAngle: r(r.domain()[0])
})
.attr("d", drawBar)
.classed("bar-foreground", true);
let text = svg.append("g").append("text")
.attr("text-anchor", "middle")
.attr("alignment-baseline", "middle")
.classed("text-value", true)
.text("-");
function update(value) {
text
.call(toggleClassesInSelection, c(value), c.range())
.text(value);
const t = svg.transition()
.duration(750)
.ease(d3.easeBackOut);
foregroundBar
.datum({value: value})
.call(toggleClassesInSelection, c(value), c.range())
.transition(t)
.attrTween("d", arcTween(r(value)));
}
function arcTween(newAngle) {
return function(d) {
let interpolate = d3.interpolate(r.range()[0], newAngle);
return function(t) {
d.endAngle = interpolate(t);
return drawBar(d);
};
};
};
return Object.assign(svg.node(), { update });
}