// Generated by CoffeeScript 1.8.0 var root, scatterplot; root = typeof exports !== "undefined" && exports !== null ? exports : this; scatterplot = function() { var axispos, chart, dataByInd, height, margin, nxticks, nyticks, pointcolor, pointsSelect, pointsize, pointstroke, rectcolor, rotate_ylab, title, titlepos, width, xNA, xlab, xlim, xscale, xticks, xvar, yNA, ylab, ylim, yscale, yticks, yvar; width = 800; height = 600; margin = { left: 60, top: 40, right: 40, bottom: 40, inner: 5 }; axispos = { xtitle: 25, ytitle: 45, xlabel: 5, ylabel: 5 }; titlepos = 20; xNA = { handle: true, force: false, width: 15, gap: 10 }; yNA = { handle: true, force: false, width: 15, gap: 10 }; xlim = null; ylim = null; nxticks = 5; xticks = null; nyticks = 5; yticks = null; rectcolor = d3.rgb(230, 230, 230); pointcolor = null; pointstroke = "black"; pointsize = 3; title = "Correlation Scatterplot"; xlab = "X"; ylab = "Y"; rotate_ylab = null; yscale = d3.scale.linear(); xscale = d3.scale.linear(); xvar = 0; yvar = 1; pointsSelect = null; dataByInd = false; chart = function(selection) { return selection.each(function(data) { var g, gEnter, group, i, indID, indtip, maxx, minx, na_value, ngroup, panelheight, paneloffset, panelwidth, points, svg, titlegrp, x, xaxis, xrange, xs, y, yaxis, yrange, ys, _i, _ref, _ref1, _ref2, _results; if (dataByInd) { x = data.data.map(function(d) { return d[xvar]; }); y = data.data.map(function(d) { return d[yvar]; }); } else { x = data.data[xvar]; y = data.data[yvar]; } indID = (_ref = data != null ? data.indID : void 0) != null ? _ref : null; indID = indID != null ? indID : (function() { _results = []; for (var _i = 1, _ref1 = x.length; 1 <= _ref1 ? _i <= _ref1 : _i >= _ref1; 1 <= _ref1 ? _i++ : _i--){ _results.push(_i); } return _results; }).apply(this); group = (_ref2 = data != null ? data.group : void 0) != null ? _ref2 : (function() { var _j, _len, _results1; _results1 = []; for (_j = 0, _len = x.length; _j < _len; _j++) { i = x[_j]; _results1.push(1); } return _results1; })(); ngroup = d3.max(group); group = (function() { var _j, _len, _results1; _results1 = []; for (_j = 0, _len = group.length; _j < _len; _j++) { g = group[_j]; _results1.push(g - 1); } return _results1; })(); pointcolor = pointcolor != null ? pointcolor : selectGroupColors(ngroup, "dark"); pointcolor = expand2vector(pointcolor, ngroup); if (x.every(function(v) { return (v != null) && !xNA.force; })) { xNA.handle = false; } if (y.every(function(v) { return (v != null) && !yNA.force; })) { yNA.handle = false; } if (xNA.handle) { paneloffset = xNA.width + xNA.gap; panelwidth = width - paneloffset; } else { paneloffset = 0; panelwidth = width; } if (yNA.handle) { panelheight = height - (yNA.width + yNA.gap); } else { panelheight = height; } xlim = xlim != null ? xlim : d3.extent(x); ylim = ylim != null ? ylim : d3.extent(y); na_value = d3.min(x.concat(y)) - 100; svg = d3.select(this).selectAll("svg").data([data]); gEnter = svg.enter().append("svg").append("g"); svg.attr("width", width + margin.left + margin.right).attr("height", height + margin.top + margin.bottom); g = svg.select("g"); g.append("rect").attr("x", paneloffset + margin.left).attr("y", margin.top).attr("height", panelheight).attr("width", panelwidth).attr("fill", rectcolor).attr("stroke", "none"); if (xNA.handle) { g.append("rect").attr("x", margin.left).attr("y", margin.top).attr("height", panelheight).attr("width", xNA.width).attr("fill", rectcolor).attr("stroke", "none"); } if (xNA.handle && yNA.handle) { g.append("rect").attr("x", margin.left).attr("y", margin.top + height - yNA.width).attr("height", yNA.width).attr("width", xNA.width).attr("fill", rectcolor).attr("stroke", "none"); } if (yNA.handle) { g.append("rect").attr("x", margin.left + paneloffset).attr("y", margin.top + height - yNA.width).attr("height", yNA.width).attr("width", panelwidth).attr("fill", rectcolor).attr("stroke", "none"); } xrange = [margin.left + paneloffset + margin.inner, margin.left + paneloffset + panelwidth - margin.inner]; yrange = [margin.top + panelheight - margin.inner, margin.top + margin.inner]; xscale.domain(xlim).range(xrange); yscale.domain(ylim).range(yrange); xs = d3.scale.linear().domain(xlim).range(xrange); ys = d3.scale.linear().domain(ylim).range(yrange); if (xNA.handle) { xscale.domain([na_value].concat(xlim)).range([margin.left + xNA.width / 2].concat(xrange)); x = x.map(function(e) { if (e != null) { return e; } else { return na_value; } }); } if (yNA.handle) { yscale.domain([na_value].concat(ylim)).range([height + margin.top - yNA.width / 2].concat(yrange)); y = y.map(function(e) { if (e != null) { return e; } else { return na_value; } }); } minx = xlim[0]; maxx = xlim[1]; yticks = yticks != null ? yticks : ys.ticks(nyticks); xticks = xticks != null ? xticks : xs.ticks(nxticks); titlegrp = g.append("g").attr("class", "title").append("text").attr("x", margin.left + width / 2).attr("y", margin.top - titlepos).style("fill", "black").style("font-size", "24px").text(title); xaxis = g.append("g").attr("class", "x axis"); xaxis.selectAll("empty").data(xticks).enter().append("line").attr("x1", function(d) { return xscale(d); }).attr("x2", function(d) { return xscale(d); }).attr("y1", margin.top).attr("y2", margin.top + height).attr("fill", "none").attr("stroke", "white").attr("stroke-width", 1).style("pointer-events", "none"); xaxis.selectAll("empty").data(xticks).enter().append("text").attr("x", function(d) { return xscale(d); }).attr("y", margin.top + height + axispos.xlabel).text(function(d) { return formatAxis(xticks)(d); }); xaxis.append("text").attr("class", "title").attr("x", margin.left + width / 2).attr("y", margin.top + height + axispos.xtitle).style("fill", "black").text(xlab); if (xNA.handle) { xaxis.append("text").attr("x", margin.left + xNA.width / 2).attr("y", margin.top + height + axispos.xlabel).text("N/A"); } rotate_ylab = rotate_ylab != null ? rotate_ylab : ylab.length > 1; yaxis = g.append("g").attr("class", "y axis"); yaxis.selectAll("empty").data(yticks).enter().append("line").attr("y1", function(d) { return yscale(d); }).attr("y2", function(d) { return yscale(d); }).attr("x1", margin.left).attr("x2", margin.left + width).attr("fill", "none").attr("stroke", "white").attr("stroke-width", 1).style("pointer-events", "none"); yaxis.selectAll("empty").data(yticks).enter().append("text").attr("y", function(d) { return yscale(d); }).attr("x", margin.left - axispos.ylabel).text(function(d) { return formatAxis(yticks)(d); }); yaxis.append("text").attr("class", "title").attr("y", margin.top + height / 2).attr("x", margin.left - axispos.ytitle).style("fill", "black").text(ylab).attr("transform", rotate_ylab ? "rotate(270," + (margin.left - axispos.ytitle) + "," + (margin.top + height / 2) + ")" : ""); if (yNA.handle) { yaxis.append("text").attr("x", margin.left - axispos.ylabel).attr("y", margin.top + height - yNA.width / 2).text("N/A"); } indtip = d3.tip().attr('class', 'd3-tip').html(function(d, i) { return indID[i]; }).direction('e').offset([0, 10]); svg.call(indtip); if (js_data.slope && js_data.intercept) { g.append("line").attr("x1", xscale(minx) - margin.inner).attr('y1', yscale(js_data.slope * minx + js_data.intercept)).attr("x2", xscale(maxx * 1) + margin.inner).attr("y2", yscale(slope * maxx * 1 + intercept)).style("stroke", "black").style("stroke-width", 2); } points = g.append("g").attr("id", "points"); pointsSelect = points.selectAll("empty").data(d3.range(x.length)).enter().append("circle").attr("cx", function(d, i) { return xscale(x[i]); }).attr("cy", function(d, i) { return yscale(y[i]); }).attr("class", function(d, i) { return "pt" + i; }).attr("r", pointsize).attr("fill", function(d, i) { return pointcolor[group[i]]; }).attr("stroke", pointstroke).attr("stroke-width", "1").attr("opacity", function(d, i) { if (((x[i] != null) || xNA.handle) && ((y[i] != null) || yNA.handle)) { return 1; } return 0; }).on("mouseover.paneltip", indtip.show).on("mouseout.paneltip", indtip.hide); g.append("rect").attr("x", margin.left + paneloffset).attr("y", margin.top).attr("height", panelheight).attr("width", panelwidth).attr("fill", "none").attr("stroke", "black").attr("stroke-width", "none"); if (xNA.handle) { g.append("rect").attr("x", margin.left).attr("y", margin.top).attr("height", panelheight).attr("width", xNA.width).attr("fill", "none").attr("stroke", "black").attr("stroke-width", "none"); } if (xNA.handle && yNA.handle) { g.append("rect").attr("x", margin.left).attr("y", margin.top + height - yNA.width).attr("height", yNA.width).attr("width", xNA.width).attr("fill", "none").attr("stroke", "black").attr("stroke-width", "none"); } if (yNA.handle) { return g.append("rect").attr("x", margin.left + paneloffset).attr("y", margin.top + height - yNA.width).attr("height", yNA.width).attr("width", panelwidth).attr("fill", "none").attr("stroke", "black").attr("stroke-width", "none"); } }); }; chart.width = function(value) { if (!arguments.length) { return width; } width = value; return chart; }; chart.height = function(value) { if (!arguments.length) { return height; } height = value; return chart; }; chart.margin = function(value) { if (!arguments.length) { return margin; } margin = value; return chart; }; chart.axispos = function(value) { if (!arguments.length) { return axispos; } axispos = value; return chart; }; chart.titlepos = function(value) { if (!arguments.length) { return titlepos; } titlepos; return chart; }; chart.xlim = function(value) { if (!arguments.length) { return xlim; } xlim = value; return chart; }; chart.nxticks = function(value) { if (!arguments.length) { return nxticks; } nxticks = value; return chart; }; chart.xticks = function(value) { if (!arguments.length) { return xticks; } xticks = value; return chart; }; chart.ylim = function(value) { if (!arguments.length) { return ylim; } ylim = value; return chart; }; chart.nyticks = function(value) { if (!arguments.length) { return nyticks; } nyticks = value; return chart; }; chart.yticks = function(value) { if (!arguments.length) { return yticks; } yticks = value; return chart; }; chart.rectcolor = function(value) { if (!arguments.length) { return rectcolor; } rectcolor = value; return chart; }; chart.pointcolor = function(value) { if (!arguments.length) { return pointcolor; } pointcolor = value; return chart; }; chart.pointsize = function(value) { if (!arguments.length) { return pointsize; } pointsize = value; return chart; }; chart.pointstroke = function(value) { if (!arguments.length) { return pointstroke; } pointstroke = value; return chart; }; chart.dataByInd = function(value) { if (!arguments.length) { return dataByInd; } dataByInd = value; return chart; }; chart.title = function(value) { if (!arguments.length) { return title; } title = value; return chart; }; chart.xlab = function(value) { if (!arguments.length) { return xlab; } xlab = value; return chart; }; chart.ylab = function(value) { if (!arguments.length) { return ylab; } ylab = value; return chart; }; chart.rotate_ylab = function(value) { if (!arguments.length) { return rotate_ylab; } rotate_ylab = value; return chart; }; chart.xvar = function(value) { if (!arguments.length) { return xvar; } xvar = value; return chart; }; chart.yvar = function(value) { if (!arguments.length) { return yvar; } yvar = value; return chart; }; chart.xNA = function(value) { if (!arguments.length) { return xNA; } xNA = value; return chart; }; chart.yNA = function(value) { if (!arguments.length) { return yNA; } yNA = value; return chart; }; chart.yscale = function() { return yscale; }; chart.xscale = function() { return xscale; }; chart.pointsSelect = function() { return pointsSelect; }; return chart; }; root.scatterplot = scatterplot;