chart = {
var margin = {top: 30, right: 80, bottom: 40, left: 30};
var w = width - margin.left - margin.right;
var h = height - margin.top - margin.bottom;
const svg = d3.select(DOM.svg(width, height));
var buckets = graph.nodes.map(function(node) {
return {
id: node.id,
opens: 0
};
});
var bucketMap = buckets.reduce(function(map, obj) {
map[obj.id] = obj;
return map;
}, {});
graph.links.forEach(link => {
if(bucketMap.hasOwnProperty(link.target)) {
bucketMap[link.target].opens += parseInt(link.opens);
}
});
const barWidth = w / buckets.length;
var xAxisTicks = graph.nodes.map(function(xTick) {
return xTick.id;
});
var xScale = d3.scalePoint()
.domain(xAxisTicks)
.range([0, w]);
var xAxis = d3.axisBottom(xScale)
.tickSize(0);
svg.append('g')
.attr('class', 'x axis')
.attr('transform', 'translate(' + (margin.left + (barWidth / 2)) + ',' + (h + margin.top) + ')')
.call(xAxis)
.select('.domain')
.remove();
var maxY = d3.max(buckets, function (d) { return d.opens; })
var color = d3.scaleLinear()
.domain([0, 1, maxY/2, maxY])
.range(['#d8dbde', '#ffffdd', '#3e9583', '#1f2d86']);
let g = svg.append('g')
.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
let bars = g.selectAll('.bars')
.data(buckets)
.enter()
.append('g')
.attr('transform', function (d) {
return 'translate(' + xScale(d.id) + ',0)';
});
bars.append('rect')
.attr('width', barWidth)
.attr('height', h)
.style('fill', function (d) { return color(d.opens); });
return svg.node()
}