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)};
}