var parentId = "#graph-wrapper"; var animDuration = 1000; var margin = {top: 20, right: 50, bottom: 50, left: 100}; var width = $(parentId).width() - margin.left - margin.right, height = $(parentId).height() - margin.top - margin.bottom; var xScale = d3.scale.linear() .range([0,width]); var yScale = d3.scale.linear() .range([height, 0]); var line = d3.svg.line(); var xAxis = d3.svg.axis() .scale(xScale) .tickSize(-height) .tickPadding(8) .tickFormat(d3.round) .orient("bottom"); var yAxis = d3.svg.axis() .scale(yScale) .tickSize(-width) .tickPadding(8) .orient("left"); var svg = d3.select(parentId).append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .attr("id","svg-parent") .append("g") .attr("id","graph-plane") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + (height) + ")") .call(xAxis); svg.append("g") .attr("class", "y axis") .attr("transform", "translate(" +0+ ",0)") .call(yAxis); svg.append("path") .attr("class","trendline") .attr("stroke-width", 1) .style("stroke","steelblue") .style("fill","none"); d3.selectAll(".graph-picklist").on("change",function(){ updateChart(d3.select("#graph-picklist-x")[0][0].value, d3.select("#graph-picklist-y")[0][0].value); }); function getDimensions(x,y){ var returnX=[]; var returnY=[]; var returnPairs = []; allData.forEach(function(d){ var pair = {x: d[x],y: d[y]}; returnPairs.push(pair); returnX.push(d[x]); returnY.push(d[y]); }); return {x:returnX,y:returnY,pairs:returnPairs}; } function updateTitle(x,y){ var title = d3.select("#title").text("Linear Regression: "+x+" vs "+y); } // returns slope, intercept and r-square of the line //Pulled from http://bl.ocks.org/benvandyke/8459843 function leastSquares(xSeries, ySeries) { var reduceSumFunc = function(prev, cur) { return prev + cur; }; var xBar = xSeries.reduce(reduceSumFunc) * 1.0 / xSeries.length; var yBar = ySeries.reduce(reduceSumFunc) * 1.0 / ySeries.length; var ssXX = xSeries.map(function(d) { return Math.pow(d - xBar, 2); }) .reduce(reduceSumFunc); var ssYY = ySeries.map(function(d) { return Math.pow(d - yBar, 2); }) .reduce(reduceSumFunc); var ssXY = xSeries.map(function(d, i) { return (d - xBar) * (ySeries[i] - yBar); }) .reduce(reduceSumFunc); var slope = ssXY / ssXX; var intercept = yBar - (xBar * slope); var rSquare = Math.pow(ssXY, 2) / (ssXX * ssYY); return [slope, intercept, rSquare]; } //http://snipplr.com/view/37687/random-number-float-generator/ function randomFloatBetween(minValue,maxValue,precision){ if(typeof(precision) == 'undefined'){ precision = 2; } return parseFloat(Math.min(minValue + (Math.random() * (maxValue - minValue)),maxValue).toFixed(precision)); } //"draw" the line with many points respecting the calculated equation function calculateLineData(leastSquares,xRange,iterations){ var returnData = []; for(var i=0; i