slope_chart = {
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height + graph.margin.bottom])
.attr("font-family", graph.font)
.attr("font-size", 10);
let n = slope_data.dates.length
let formatNumber = slope_y.tickFormat(100)
svg.append("g")
.attr("text-anchor", "middle")
.selectAll("g")
.data(["2017-18","2018-19"])
.join("g")
.attr("transform", (d, i) => `translate(${slope_x(i)},20)`)
.call(g => g.append("text").text(d => d))
.call(g => g.append("line").attr("y1", 3).attr("y2", 9).attr("stroke", "currentColor"));
svg.append("g")
.attr("fill", "none")
.attr("stroke", colours.primary)
.selectAll("path")
.data(slope_data)
.join("path")
.attr("d", d => slope_line(d.values));
svg.append("g")
.selectAll("g")
.data(slope_data.dates)
.join("g")
.attr("transform", (d, i) => `translate(${slope_x(i) + (i === 0 ? -padding : i === n - 1 ? padding : 0)},0)`)
.attr("text-anchor", (d, i) => i === 0 ? "end" : i === n - 1 ? "start" : "middle")
.selectAll("text")
.data((d, i) => d3.zip(
slope_data.map(i === 0 ? d => `${d.name} ${formatNumber(d.values[i])}`
: i === n - 1 ? d => `${formatNumber(d.values[i])} ${d.name}`
: d => `${formatNumber(d.values[i])}`),
slope_dodge(slope_data.map(d => slope_y(d.values[i])))))
.join("text")
.attr("y", ([, y]) => y)
.attr("dy", "0.35em")
.text(([text]) => text)
.call(slope_halo);
return svg.node();
}