d3.custom = {}; d3.custom.barChart = function module() { var margin = {top: 20, right: 20, bottom: 40, left: 40}, width = 500, height = 500, gap = 0, ease = 'cubic-in-out'; var svg, duration = 500; var dispatch = d3.dispatch('customHover'); function exports(_selection) { _selection.each(function(_data) { var chartW = width - margin.left - margin.right, chartH = height - margin.top - margin.bottom; var x1 = d3.scale.ordinal() .domain(_data.map(function(d, i){ return i; })) .rangeRoundBands([0, chartW], .1); var y1 = d3.scale.linear() .domain([0, d3.max(_data, function(d, i){ return d; })]) .range([chartH, 0]); var xAxis = d3.svg.axis() .scale(x1) .orient('bottom'); var yAxis = d3.svg.axis() .scale(y1) .orient('left'); var barW = chartW / _data.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().duration(duration).attr({width: width, height: height}) svg.select('.container-group') .attr({transform: 'translate(' + margin.left + ',' + margin.top + ')'}); svg.select('.x-axis-group.axis') .transition() .duration(duration) .ease(ease) .attr({transform: 'translate(0,' + (chartH) + ')'}) .call(xAxis); svg.select('.y-axis-group.axis') .transition() .duration(duration) .ease(ease) .call(yAxis); var gapSize = x1.rangeBand() / 100 * gap; var barW = x1.rangeBand() - gapSize; var bars = svg.select('.chart-group') .selectAll('.bar') .data(_data); 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() .duration(duration) .ease(ease) .attr({ width: barW, x: function(d, i) { return x1(i) + gapSize/2; }, y: function(d, i) { return y1(d); }, height: function(d, i) { return chartH - y1(d); } }); bars.exit().transition().style({opacity: 0}).remove(); duration = 500; }); } exports.width = function(_x) { if (!arguments.length) return width; width = parseInt(_x); return this; }; exports.height = function(_x) { if (!arguments.length) return height; height = parseInt(_x); duration = 0; return this; }; exports.gap = function(_x) { if (!arguments.length) return gap; gap = _x; return this; }; exports.ease = function(_x) { if (!arguments.length) return ease; ease = _x; return this; }; d3.rebind(exports, dispatch, 'on'); return exports; };