stacked_chart = (w=200, h=100, g) => {
const svg =
g ||
d3
.create("svg")
.attr("viewBox", [0, 0, w, h])
.attr("width", w)
.attr("height", h);
let margin = {top: 10, right: 10, bottom: 10, left: 10 };
let width = w - margin.left - margin.right,
height = h - margin.top - margin.bottom;
let n = 8, m = 4;
let data = d3.range(n).map(d => {
return d3.range(m).map(Math.random)
})
const layers = d3.stack().keys(d3.range(n))(data)
let max_layers = d3.max(layers, d => {
return d3.max(d, e => { return e[1]})
})
const x = d3.scaleBand()
.domain(d3.range(n))
.range([0, width])
.padding(.1)
const y = d3.scaleLinear()
.domain([0, max_layers])
.range([0, height])
svg.selectAll("g").data(layers)
.enter()
.append("g")
.attr("transform", (d, i) => "translate(" + x(i) + ", 0)")
.selectAll("rect")
.data(d => d)
.enter()
.append("rect")
.attr("x", (d, i) => x(i))
.attr("fill", "white")
.attr("stroke", "black")
.attr("y", d => height - (y(d[1]) - y(d[0])))
.attr("height", d => y(d[1]) - y(d[0]))
.attr("width", x.bandwidth())
return svg.node()
}