{
svg.selectAll('g.x-bottom')
.data([1])
.enter()
.append("g")
.classed('x-bottom', true)
.attr("transform", `translate(0,${height - margin.bottom})`)
.call(d3.axisBottom(x));
svg.selectAll('g.y-left')
.data([1])
.enter()
.append("g")
.classed('y-left', true)
.attr("transform", `translate(${margin.left},0)`)
.call(d3.axisLeft(y));
let p = svg.selectAll('path.regression-line')
.data([regressionEndpoints]);
let pEnter = p.enter()
.append("path")
.classed('regression-line', true)
.attr("fill", "none")
.attr("stroke", "deeppink")
.attr("stroke-width", 1.5)
.attr("stroke-linejoin", "round")
.attr("stroke-dasharray", "10 10")
.attr("stroke-linecap", "round");
p.merge(pEnter)
.attr("d", d3.line()
.x(d => x(d[0]))
.y(d => y(d[1])));
let circles = svg.selectAll("circle")
.data(data, d => d.join());
circles.exit().remove();
circles.enter()
.append('circle')
.attr("r", "5")
.attr('fill', (d, i) => `hsl(${i * 5 % 360}, 50%, 50%)`)
.attr('transform', d => `translate(${x(d[0])}, ${y(d[1])})`);
return svg.node();
}