function histogram() { var margin = { top: 20, left: 20, bottom: 20, right: 20 }; var width = 500; var height = 500; var bins = d3.range(20); var padding = 1; var value = function (d) { return d.value; }; var xScale = d3.scale.linear(); var yScale = d3.scale.linear(); var yAxis = d3.svg.axis().orient('left').tickSize(0); var bars = { fill: "steelblue", stroke: "white", strokeWidth: 1 }; var text = { dy: "0.80em", textAnchor: "end", fill: "white" }; function chart(selection) { selection.each(function (data, index) { var histogram = d3.layout.histogram() .bins(bins) .value(value); // .frequency(frequency); var histoData = histogram(data); width = width - margin.left - margin.right; height = height - margin.top - margin.bottom; xScale .domain([0, d3.max(histoData, function (d) { return d.y; })]) .range([0, width]); yScale .domain(d3.extent(bins)) .range([0, height]); var svg = d3.select(this).selectAll('svg') .data([histoData]); svg.exit().remove(); svg.enter().append("svg") svg.attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var g = svg.select('g'); g.append("g") .attr("class", "y axis") .call(yAxis.scale(yScale)); var group = g.selectAll("groups").data(histoData); group.exit().remove(); group.enter().append("g").attr('class', 'bars'); group.append("rect") .attr("x", function (d) { return xScale(0); }) .attr("y", function (d) { return yScale(d.x); }) .attr("width", function (d) { return xScale(d.y); }) .attr("height", height / (bins.length - 1)) .attr("fill", bars.fill) .attr("stroke", bars.stroke) .attr("stroke-width", bars.strokeWidth); group.append("text") .attr("x", function (d) { return xScale(d.y) - 2; }) .attr("y", function (d) { return yScale(d.x) + ((height / (bins.length - 1)) / 2) / 2; }) .attr("dy", text.dy) .attr("text-anchor", text.textAnchor) .attr("fill", text.fill) .style('font-size', (height / (bins.length -1)) / 2) .text(function (d) { return !d.y ? "" : d.y; }); group.selectAll('text').each(function (d) { var text = d3.select(this); var width = text.node().getBBox().width; if (width > xScale(d.y)) { text.attr('text-anchor', 'start') .style('fill', '#000000') .attr('x', function (d) { return xScale(d.y) + 5; }); } }); }); } function valuator(val) { if (typeof val === 'function') return val; if (typeof val === 'string' || typeof val === 'number') { return function (d) { return d[val]; } } throw new Error(val + ' is an unexpected type'); } // Public API chart.margin = function (_) { if (!arguments.length) return margin; margin.top = typeof _.top !== "undefined" ? _.top : margin.top; margin.right = typeof _.right !== "undefined" ? _.right : margin.right; margin.bottom = typeof _.bottom !== "undefined" ? _.bottom : margin.bottom; margin.left = typeof _.left !== "undefined" ? _.left : margin.left; return chart; }; chart.width = function (_) { if (!arguments.length) return width; width = _; return chart; }; chart.height = function (_) { if (!arguments.length) return height; height = _; return chart; }; chart.bins = function (_) { if (!arguments.length) return bins; bins = _; return chart; }; chart.value = function (_) { if (!arguments.length) return value; value = valuator(_); return chart; }; chart.bars = function (_) { if (!arguments.length) return bars; bars.cssClass = typeof _.cssClass !== "undefined" ? _.cssClass : bars.cssClass; bars.fill = typeof _.fill !== "undefined" ? _.fill : bars.fill; bars.stroke = typeof _.stroke !== "undefined" ? _.stroke : bars.stroke; bars.strokeWidth = typeof _.strokeWidth !== "undefined" ? _.strokeWidth : bars.strokeWidth; return chart; }; chart.text = function (_) { if (!arguments.length) return text; text.cssClass = typeof _.cssClass !== "undefined" ? _.cssClass : text.cssClass; text.fill = typeof _.fill !== "undefined" ? _.fill : text.fill; text.dy = typeof _.dy !== "undefined" ? _.dy : text.dy; text.textAnchor = typeof _.textAnchor !== "undefined" ? _.textAnchor : text.textAnchor; return chart; }; return chart; }