/* requires D3 + https://github.com/Caged/d3-tip */ d3.boxesplot = function() { //defaults margin = { top: 10, right: 30, bottom: 30, left: 40 }; function boxesplot(selection) { selection.each(function(d, i) { //options var data = (typeof(data) === "function" ? data(d) : d.data), lines = (typeof(lines) === "function" ? lines(d) : d.lines), size = (typeof(size) === "function" ? size(d) : d.size); // chart sizes var width = size['width'] - margin.left - margin.right, height = size['height'] - margin.top - margin.bottom; //set up scales var x = d3.scale.linear() .domain([-0.09, 1.09]) .range([0, width]) var y = d3.scale.linear() .domain([-0.1, 1.1]) .range([height, 0]); //set up axes var xAxis = d3.svg.axis() .scale(x) .orient("bottom"); var yAxis = d3.svg.axis() .scale(y) .orient("left"); var element = d3.select(this); //add x axis element.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis) .append("text") .attr("x", x(1)) .attr("dx", "1em") .attr("dy", "-1em") .style("text-anchor", "end") .text("Distance"); var line = d3.svg.line() .x( function(d) { return d[0]; }) .y(function(d) { return d[1]; }); centerline = Array([x(lines["mean"]),y(-0.1)],[x(lines["mean"]),y(1.1)]); element.append("path") .datum(centerline) .attr("class", "centerline") .attr("d", line); deviationlines = [ [ [x(lines["mean"]+lines["dev"]),y(-0.1)], [x(lines["mean"]+lines["dev"]),y(1.1)] ], [ [x(lines["mean"]-lines["dev"]),y(-0.1)], [x(lines["mean"]-lines["dev"]),y(1.1)] ], ]; element.selectAll(".deviationline") .data(deviationlines) .enter() .append("path") .datum(function(d) { return d; }) .attr("class", "deviationline") .attr("d", line); coef = .5; //add randoms for (i in data) { data[i]['random'] = Math.random(); } //create boxes element.selectAll(".rectangle") .data(data) .enter() .append("rect") .attr("x", function (d) { a = Math.max(d.result_1,d.result_2); return x(d.distance-coef*a/2) }) .attr("y", function (d) { b = Math.min(d.result_1,d.result_2); return y(d.random*0.75+0.25-coef*b/2); }) .attr("width", function (d) { a = Math.max(d.result_1,d.result_2); return x(coef*a)-x(0); }) .attr("height", function (d) { b = Math.min(d.result_1,d.result_2); return -1*y(7/2*coef*b)+y(0); }) //7/2 height vs. width of chart //.attr("stroke-width", function(d) {return d.r2}) .attr("class", function(d) {return d.region}) .attr("title", function(d) {return d.distance + ":" + d.result_1 + ":" + d.result_2}); //create lines around boxes - longer element.selectAll(".lines") .data(data) .enter() .append("path") .attr("class","line") .attr("stroke",function(d) { if ((d.color_1 != '') && (d.color_2 != '')) { if (d.result_1>d.result_2) return d.color_1; else return d.color_2; } }) .attr("d",function(d) { a = Math.max(d.result_1,d.result_2); b = Math.min(d.result_1,d.result_2); xx = x(d.distance-coef*a/2); yy = y(d.random*0.75+0.25-coef*b/2); width = x(coef*a)-x(0); l = Array([xx,yy],[xx+width,yy]); return line(l); }) //create lines around boxes - longer 2 element.selectAll(".lines") .data(data) .enter() .append("path") .attr("class","line") .attr("stroke",function(d) { if ((d.color_1 != '') && (d.color_2 != '')) { if (d.result_1>d.result_2) return d.color_1; else return d.color_2; } }) .attr("d",function(d) { a = Math.max(d.result_1,d.result_2); b = Math.min(d.result_1,d.result_2); xx = x(d.distance-coef*a/2); yy = y(d.random*0.75+0.25-coef*b/2)-1*y(7/2*coef*b)+y(0); width = x(coef*a)-x(0); l = Array([xx,yy],[xx+width,yy]); return line(l); }) //create lines around boxes - shorter element.selectAll(".lines") .data(data) .enter() .append("path") .attr("class","line") .attr("stroke",function(d) { if ((d.color_1 != '') && (d.color_2 != '')) { if (d.result_1>d.result_2) return d.color_2; else return d.color_1; } }) .attr("d",function(d) { a = Math.max(d.result_1,d.result_2); b = Math.min(d.result_1,d.result_2); xx = x(d.distance-coef*a/2); yy = y(d.random*0.75+0.25-coef*b/2); height = -1*y(7/2*coef*b)+y(0); l = Array([xx,yy],[xx,yy+height]); return line(l); }) //create lines around boxes - shorter 2 element.selectAll(".lines") .data(data) .enter() .append("path") .attr("class","line") .attr("stroke",function(d) { if ((d.color_1 != '') && (d.color_2 != '')) { if (d.result_1>d.result_2) return d.color_2; else return d.color_1; } }) .attr("d",function(d) { a = Math.max(d.result_1,d.result_2); b = Math.min(d.result_1,d.result_2); xx = x(d.distance-coef*a/2)+x(coef*a)-x(0); yy = y(d.random*0.75+0.25-coef*b/2); height = -1*y(7/2*coef*b)+y(0); l = Array([xx,yy],[xx,yy+height]); return line(l); }) }); } // boxesplot.data = function(value) { if (!arguments.length) return value; data = value; return boxesplot; } boxesplot.lines = function(value) { if (!arguments.length) return value; lines = value; return boxesplot; } boxesplot.size = function(value) { if (!arguments.length) return value; size = value; return boxesplot; } return boxesplot; }