// Bar chart reusable component ///////////////////////////////////// d3.custom = {}; d3.custom.barChart = function module() { var config = { margin: {top: 20, right: 20, bottom: 40, left: 60}, width: 500, height: 500 }; var svg; var dispatch = d3.dispatch('customHover'); function exports(_selection) { _selection.each(function(_data) { var values = _data.map(function(d, i){ return d.value; }); var labelMaxLength = 9; var names = _data.map(function(d, i){ return (d.key.length >= labelMaxLength) ? d.key.substring(0, labelMaxLength) + '…' : d.key; }); var chartW = config.width - config.margin.left - config.margin.right, chartH = config.height - config.margin.top - config.margin.bottom; var x1 = d3.scale.ordinal() .domain(names) .rangeRoundBands([0, chartW], .1); var y1 = d3.scale.linear() .domain([0, d3.max(values)]) .range([chartH, 0]); var xAxis = d3.svg.axis() .scale(x1) .orient('bottom'); var yAxis = d3.svg.axis() .scale(y1) .orient('left') .tickFormat(d3.format('s')); var barW = chartW / values.length; if(!svg) { svg = d3.select(this) .append('svg') .classed('chart', true); var container = svg.append('g').classed('container-group', true); container.append('g').classed('chart-group', true); container.append('g').classed('x-axis-group axis', true); container.append('g').classed('y-axis-group axis', true); } svg.transition().attr({width: config.width, height: config.height}) svg.select('.container-group') .attr({transform: 'translate(' + config.margin.left + ',' + config.margin.top + ')'}); svg.select('.x-axis-group.axis') .attr({transform: 'translate(0,' + (chartH) + ')'}) .transition() .call(xAxis); svg.select('.y-axis-group.axis') .transition() .call(yAxis); var barW = x1.rangeBand(); var bars = svg.select('.chart-group') .selectAll('.bar') .data(values); bars.enter().append('rect') .classed('bar', true) .attr({x: chartW, width: barW, y: function(d, i) { return y1(d); }, height: function(d, i) { return chartH - y1(d); } }) .on('mouseover', dispatch.customHover); bars.transition() .attr({ width: barW, x: function(d, i) { return x1(names[i]); }, y: function(d, i) { return y1(d); }, height: function(d, i) { return chartH - y1(d); } }); bars.exit().transition().style({opacity: 0}).remove(); }); } exports.config = function(_newConfig) { if (!arguments.length) return width; for(var x in _newConfig) if(x in config) config[x] = _newConfig[x]; return this; }; d3.rebind(exports, dispatch, 'on'); return exports; };