svg = {
let yearIndex = 0;
let yearData = data.filter(d => d.year === years[yearIndex])
.sort(yearSort);
y.domain(yearData.map(d => d.city));
let svg = d3.select(DOM.svg(width, height))
.attr("font-family", fontFamily);
let gView = svg.append("g")
.classed("view", true)
.attr("transform", `translate(${margin.left}, ${margin.top})`);
let bars = gView.selectAll("rect")
.data(yearData)
.join("rect")
.attr("fill", "#f38051")
.attr("x", 0)
.attr("y", d => y(d.city))
.attr("width", d => x(d.cost))
.attr("height", y.bandwidth());
let title = svg.append("g")
.classed("title", true)
.attr("transform", `translate(${margin.left}, 0)`)
.append("text")
.classed("title", true)
.attr("y", titleFontSize)
.text(d => titleText(yearData));
svg.append("g")
.classed("x-axis", true)
.call(xAxis);
let gy = svg.append("g")
.classed("y-axis", true)
.call(yAxis);
setInterval(() => {
let t = svg.transition()
.duration(transitionDuration);
yearIndex++;
if (yearIndex >= years.length) {
yearIndex = 0;
}
let yearData = data.filter(d => d.year === years[yearIndex])
.sort(yearSort);
y.domain(yearData.map(d => d.city));
gy.transition(t)
.call(yAxis);
bars.data(yearData, d => d.city)
.attr('stroke', '#2c2c2c')
.attr('stroke-width', 2)
.transition(t)
.attr("y", d => y(d.city))
.attr("width", d => x(d.number_of_appointments));
title.text(titleText(yearData));
}, timerInterval);
return svg.node();
}