d3.svg.legend = function() { var data = []; var size = [300,20]; var xScale = d3.scale.linear(); var scale; var title = "Legend"; var numberFormat = d3.format(".4n"); var units = "Units"; var unitTranslate =[0,0]; function legend(gSelection) { createLegendData(scale); var xMin = d3.min(data, function(d) {return d.domain[0]}); var xMax = d3.max(data, function(d) {return d.domain[1]}); xScale.domain([xMin,xMax]).range([0,size[0]]) console.log(data) gSelection.selectAll("rect") .data(data) .enter() .append("rect") .attr("height", size[1]) // .attr("width", function (d) {return xScale(d.domain[1]) - xScale(d.domain[0])}) .attr("width", size[0] / scale.domain().length) // .attr("x", function (d) {return xScale(d.domain[0])}) .attr("x", function(d,i) {return i * (size[0] / scale.domain().length)}) .style("fill", function(d) {return d.color}) gSelection.selectAll("line") .data(data) .enter() .append("line") // .attr("x1", function (d) {return xScale(d.domain[0])}) // .attr("x2", function (d) {return xScale(d.domain[0])}) .attr("x1", function(d,i) {return (i + .5) * (size[0] / scale.domain().length)}) .attr("x2", function(d,i) {return (i + .5) * (size[0] / scale.domain().length)}) .attr("y1", 0) .attr("y2", size[1] + 5) .style("stroke", "black") .style("stroke-width", "2px") gSelection.selectAll("text") .data(data) .enter() .append("g") // .attr("transform", function (d) {return "translate(" + (xScale(d.domain[0])) +"," + (size[1] + 20) + ")"}) .attr("transform", function (d,i) {return "translate(" + ((i + .5) * (size[0] / scale.domain().length)) +"," + (size[1] + 20) + ")"}) .style("text-anchor", "middle") .append("text") .text(function(d) {return numberFormat(d.domain[0])}) gSelection.append("text") .attr("transform", function (d) {return "translate(" + (xScale(xMin)) +"," + (size[1] - 30) + ")"}) .text(title) gSelection.append("text") .attr("transform", function (d) {return "translate(" + (xScale(xMax) + unitTranslate[0]) +"," + (size[1] + 20 + unitTranslate[1]) + ")"}) .text(units) return legend; } function createLegendData(incScale) { var rangeArray = incScale.range(); data = []; for (x in rangeArray) { var colorValue = rangeArray[x]; if (incScale.invertExtent) { var domainValues = incScale.invertExtent(colorValue); } else { if (x == incScale.domain().length) { var domainValues = [incScale.domain()[x],incScale.domain()[x]]; } else { var domainValues = [incScale.domain()[x],incScale.domain()[parseInt(x) + 1]]; } } data.push({color: colorValue, domain: domainValues}) } } legend.scale = function(newScale) { if (!arguments.length) return scale; scale = newScale; return this; } legend.title = function(newTitle) { if (!arguments.length) return title; title = newTitle; return this; } legend.unitLabel = function(newUnits) { if (!arguments.length) return units; units = newUnits; return this; } legend.unitTranslate = function(newTranslate) { if (!arguments.length) return unitTranslate; unitTranslate = newTranslate; return this; } legend.formatter = function(newFormatter) { if (!arguments.length) return numberFormat; numberFormat = newFormatter; return this; } return legend; }