histogram = (data, w=400, h=200, 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: 50 };
let width = w - margin.left - margin.right,
height = h - margin.top - margin.bottom;
const x = d3.scaleLinear()
.domain([data[0].x0, data[data.length - 1].x1])
.range([margin.left, width]);
const y = d3.scaleLinear()
.domain([0, d3.max(data.map(d => d.length))])
.range([height + margin.top, margin.top]);
svg.selectAll('rect.hist').data(data).enter().append('rect')
.attr('class', 'hist')
.attr('x', d => x(d.x0))
.attr('y', d => y(d.length))
.attr('height', d => height - y(d.length))
.attr('width', d => x(d.x1) - x(d.x0))
let xAxis = d3.axisBottom()
.scale(x);
let yAxis = d3.axisLeft().scale(y)
svg.append("g")
.attr("transform", `translate(${margin.left},0)`)
.call(yAxis);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
return svg.node();
}