{
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height]);
let data = by_type.find(t => t.key == inc_type).values.sort((a,b) => d3.ascending(a.key,b.key))
let x = d3.scaleBand()
.domain(data.map(d => d.key))
.range([margin.left, width - margin.right])
.padding(0.1)
let xAxis = g => g
.attr("transform", `translate(0,${height - margin.bottom})`)
.call(d3.axisBottom(x)).selectAll("text")
.attr("y", 0)
.attr("x", 9)
.attr("dy", ".35em")
.attr("transform", "rotate(90)")
.style("text-anchor", "start");
let y = d3.scaleLinear()
.domain([0,d3.extent(data, d => d.value)[1]]).nice()
.range([height - margin.bottom, margin.top])
let yAxis = g => g
.attr("transform", `translate(${margin.left},0)`)
.call(d3.axisLeft(y))
svg.append("g")
.call(xAxis);
svg.append("g")
.call(yAxis);
svg.append("g")
.attr("fill", "#933")
.selectAll("rect")
.data(data)
.join("rect")
.attr("x", d => x(d.key))
.attr("y", d => y(d.value))
.attr("height", d => y(0) - y(d.value))
.attr("width", x.bandwidth());
svg.append("g")
.selectAll("text")
.data(data)
.join("text")
.attr("font-size", "12px")
.attr("text-anchor", "middle")
.attr("x", d => x(d.key) + x.bandwidth()/2)
.attr("y", d => y(d.value) - 5).text(d => d.value);
let xSeries = data.map(d => x(d.key));
let ySeries = data.map(d => y(d.value));
let {slope, intercept} = leastSquares(xSeries, ySeries);
const ptAx = d3.min(xSeries);
const ptAy = slope * d3.min(xSeries) + intercept;
const ptBx = d3.max(xSeries);
const ptBy = intercept + slope * d3.max(xSeries);
svg.append("line")
.attr("stroke", "orange")
.attr("stroke-width", 3)
.attr("x1", ptAx + x.bandwidth()/2)
.attr("y1", ptAy)
.attr("x2", ptBx + x.bandwidth()/2)
.attr("y2", ptBy);
return svg.node();
}