Chart showing Auto-Calculated Trend using Line Chart - CanvasJS JavaScript Charts

Chart showing Auto-Calculated Trend using Line Chart - CanvasJS JavaScript Charts

by canvasjs

HTML

<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
<br/><!-- Just so that JSFiddle's Result label doesn't overlap the Chart -->
<div id="chartContainer" style="height: 360px; width: 100%;"></div>

JavaScript

var data = [];

var chart = new CanvasJS.Chart("chartContainer", {
  title: {
    text: "Chart showing Trend"
  },
  axisY: {
    includeZero: false
  },
  data: [{
    type: "line",
    dataPoints: data
  }]
});

randomData(50);
chart.render();
calculateTrendLine(chart);

function randomData(count){
  var yValue = 50;
  for (var i = 0; i < count; i++) {
    yValue += Math.round(Math.random() * 10 - 5);
    data.push({ y: yValue});
  }
}

/*
References:
	https://math.stackexchange.com/a/204021
	https://classroom.synonym.com/calculate-trendline-2709.html
*/
function calculateTrendLine(chart){
  var a, b, c, d, e, slope, yIntercept;
  var xSum = 0, ySum = 0, xySum = 0, xSquare = 0, dpsLength = chart.data[0].dataPoints.length;
  for(var i = 0; i < dpsLength; i++) 	
    xySum += (chart.data[0].dataPoints[i].x * chart.data[0].dataPoints[i].y)
  a = xySum * dpsLength;

  for(var i = 0; i < dpsLength; i++){  	
    xSum += chart.data[0].dataPoints[i].x;
    ySum += chart.data[0].dataPoints[i].y;
  }
  b = xSum * ySum;

  for(var i = 0; i < dpsLength; i++)  	
    xSquare += Math.pow(chart.data[0].dataPoints[i].x, 2);    
  c = dpsLength * xSquare;

  d = Math.pow(xSum, 2);
  slope = (a-b)/(c-d);  
  e = slope * xSum;
  yIntercept = (ySum - e) / dpsLength;

  var startPoint = getTrendLinePoint(chart.data[0].dataPoints[0].x, slope, yIntercept);
  var endPoint = getTrendLinePoint(chart.data[0].dataPoints[dpsLength-1].x, slope, yIntercept);

  chart.addTo("data",{
    type: "line", //Line series showing trend
    markerSize: 0,
    dataPoints: [startPoint, endPoint]
  });
}

function getTrendLinePoint(x, slope, intercept){
  return {x: x, y: ((slope * x) + intercept)};
}