chart = {
let fullWidth = width + margin.left + margin.right,
fullHeight = height + margin.top + margin.bottom;
let svg = d3.create("svg").attr("viewBox", `0 0 ${fullWidth} ${fullHeight}`);
svg.append("defs")
.append("linearGradient")
.attr("id", "paint")
.attr("x1", "0%")
.attr("y1", "0%")
.attr("x2", "0%")
.attr("y2", "100%")
.selectAll("stop")
.data(dataset)
.join("stop")
.attr("offset", (d)=>(vertScale(d.Stage) / height))
.style("stop-color", (d)=>colors.get(d.Stage))
.style("stop-opacity", 1)
let chart = svg.append("g").classed("chart", true).attr("transform", `translate(${margin.left}, ${margin.top})`);
chart.append("g")
.attr("transform", `translate(${width/2}, 0)`)
.append("path")
.datum(dataset)
.attr("d", area)
.attr("fill", "url(#paint)")
chart.append("g")
.attr("transform", `translate(${width/2}, 0)`)
.append("path")
.datum(dataset)
.attr("d", area)
.attr("fill", "url(#paint)")
.attr("transform", "scale(-1, 1)")
chart.selectAll("text.pointer")
.data(dataset)
.join("text")
.classed("pointer", true)
.attr("x", -margin.left)
.attr("y", (d)=>vertScale2(d.Stage))
.attr("dy", (d)=>vertScale2.bandwidth()/2)
.text((d)=>`${d.Stage} (${d.Amount})`)
chart.selectAll("line.pointer")
.data(dataset)
.join("line")
.classed("pointer", true)
.attr("x1", 0)
.attr("y1", (d)=>vertScale2(d.Stage)+vertScale2.bandwidth()/2)
.attr("x2", width/2)
.attr("y2", (d)=>vertScale2(d.Stage)+vertScale2.bandwidth()/2)
.attr("stroke", "black")
.attr("strokee-width", 2)
chart.selectAll("circle")
.data(dataset)
.join("circle")
.attr("cx", width/2)
.attr("cy", (d)=>vertScale2(d.Stage)+vertScale2.bandwidth()/2)
.attr("r", 5)
return svg.node();
}