This tutorial will explain how you can use Regression plugin (available since version 4.2.2) to display automatically-calculated regression trend lines.
Trend lines, as their name suggests, help identify generic trends among seemingly randomly dispersed values.
Take this chart for example:
Run * ---------------------------------------
* This demo was created using amCharts 4.
* For more information visit:
* https://www.amcharts.com/
* Documentation is available at:
* https://www.amcharts.com/docs/v4/
* ---------------------------------------
am4core . useTheme ( am4themes_animated );
am4core . useTheme ( am4themes_dataviz );
var chart = am4core . create ( " chartdiv " , am4charts . XYChart );
date: new Date ( 2018 , 0 , 1 ),
date: new Date ( 2018 , 0 , 2 ),
date: new Date ( 2018 , 0 , 3 ),
date: new Date ( 2018 , 0 , 4 ),
date: new Date ( 2018 , 0 , 5 ),
date: new Date ( 2018 , 0 , 6 ),
date: new Date ( 2018 , 0 , 7 ),
var categoryAxis = chart . xAxes . push ( new am4charts . DateAxis ());
categoryAxis . renderer . grid . template . location = 0 ;
categoryAxis . renderer . minGridDistance = 30 ;
var valueAxis = chart . yAxes . push ( new am4charts . ValueAxis ());
var series = chart . series . push ( new am4charts . ColumnSeries ());
series . dataFields . valueY = " value " ;
series . dataFields . dateX = " date " ;
series . tooltipText = " {dateX}: [b]{valueY}[/] " ;
chart . legend = new am4charts . Legend ();
chart . cursor = new am4charts . XYCursor ();
< div id = " chartdiv " ></ div >
-apple-system , BlinkMacSystemFont, " Segoe UI " , Roboto, Helvetica , Arial , sans-serif ,
" Apple Color Emoji " , " Segoe UI Emoji " , " Segoe UI Symbol " ;
Regression trend lines regression-trend-lines
Overall, is our revenue growing or falling? Who knows.
Clever dataviz people have come up with a variety of scientific methods to calculate such trends. They are called regression lines. Let’s learn how we can use them.
The Regression plugin which we will be using, basically works by turning any LineSeries into a trend line.
This means that creating a trend line is a two-step process:
Create a LineSeries that uses same “data fields” we want to generate trend line for. In our example above, it will use the same data fields as the ColumnSeries.
Turn it into a trend line by plugging Regression plugin into it.
let regseries = chart . series . push ( new am4charts . LineSeries ());regseries . dataFields . valueY = " value " ;regseries . dataFields . dateX = " date " ;regseries . strokeWidth = 2 ;regseries . name = " Linear Regression " ;regseries . plugins . push ( new am4plugins_regression . Regression ());
var regseries = chart . series . push ( new am4charts . LineSeries ()); regseries . dataFields . valueY = " value " ; regseries . dataFields . dateX = " date " ; regseries . strokeWidth = 2 ; regseries . name = " Linear Regression " ; regseries . plugins . push ( new am4plugins_regression . Regression ());
{ // … "series": [{ // … }, { "type": "LineSeries", "dataFields": { "valueY": "value", "dateX": "date" }, "strokeWidth": 2, "name": "Linear Regression", "plugins": [{ "type": "Regression" }] }]}
The Regression plugin will ensure, that instead of using actual value values, it will instead use calculated values that represent a linear trend.
Run * ---------------------------------------
* This demo was created using amCharts 4.
* For more information visit:
* https://www.amcharts.com/
* Documentation is available at:
* https://www.amcharts.com/docs/v4/
* ---------------------------------------
am4core . useTheme ( am4themes_animated );
am4core . useTheme ( am4themes_dataviz );
var chart = am4core . create ( " chartdiv " , am4charts . XYChart );
date: new Date ( 2018 , 0 , 1 ),
date: new Date ( 2018 , 0 , 2 ),
date: new Date ( 2018 , 0 , 3 ),
date: new Date ( 2018 , 0 , 4 ),
date: new Date ( 2018 , 0 , 5 ),
date: new Date ( 2018 , 0 , 6 ),
date: new Date ( 2018 , 0 , 7 ),
var categoryAxis = chart . xAxes . push ( new am4charts . DateAxis ());
categoryAxis . renderer . grid . template . location = 0 ;
categoryAxis . renderer . minGridDistance = 30 ;
var valueAxis = chart . yAxes . push ( new am4charts . ValueAxis ());
var series = chart . series . push ( new am4charts . ColumnSeries ());
series . dataFields . valueY = " value " ;
series . dataFields . dateX = " date " ;
series . tooltipText = " {dateX}: [b]{valueY}[/] " ;
var regseries = chart . series . push ( new am4charts . LineSeries ());
regseries . dataFields . valueY = " value " ;
regseries . dataFields . dateX = " date " ;
regseries . strokeWidth = 2 ;
regseries . name = " Linear Regression " ;
regseries . plugins . push ( new am4plugins_regression . Regression ());
chart . legend = new am4charts . Legend ();
chart . cursor = new am4charts . XYCursor ();
< div id = " chartdiv " ></ div >
-apple-system , BlinkMacSystemFont, " Segoe UI " , Roboto, Helvetica , Arial , sans-serif ,
" Apple Color Emoji " , " Segoe UI Emoji " , " Segoe UI Symbol " ;
Regression trend lines regression-trend-lines-2
The beauty of this approach is that your trend line is a regular LineSeries which means you can configure it as such, and also use all of the functionality that you need, including toggling with legend, adding bullets, etc.
Currently, Regression plugin supports two trend calculation methods: linear (default) and polynomial .
To set method, use plugin object’s method property. E.g.:
let reg = regseries . plugins . push ( new am4plugins_regression . Regression ());reg . method = " polynomial " ;
var reg = regseries . plugins . push ( new am4plugins_regression . Regression ()); reg . method = " polynomial " ;
{ // ... "series": [{ // ... }, { // ... "plugins": [{ "type": "Regression", "method": "polynomial" }] }]}
Here’s an example displaying both types of the regression on the same chart:
Run * ---------------------------------------
* This demo was created using amCharts 4.
* For more information visit:
* https://www.amcharts.com/
* Documentation is available at:
* https://www.amcharts.com/docs/v4/
* ---------------------------------------
am4core . useTheme ( am4themes_animated );
am4core . useTheme ( am4themes_dataviz );
var chart = am4core . create ( " chartdiv " , am4charts . XYChart );
date: new Date ( 2018 , 0 , 1 ),
date: new Date ( 2018 , 0 , 2 ),
date: new Date ( 2018 , 0 , 3 ),
date: new Date ( 2018 , 0 , 4 ),
date: new Date ( 2018 , 0 , 5 ),
date: new Date ( 2018 , 0 , 6 ),
date: new Date ( 2018 , 0 , 7 ),
var categoryAxis = chart . xAxes . push ( new am4charts . DateAxis ());
categoryAxis . renderer . grid . template . location = 0 ;
categoryAxis . renderer . minGridDistance = 30 ;
var valueAxis = chart . yAxes . push ( new am4charts . ValueAxis ());
var series = chart . series . push ( new am4charts . ColumnSeries ());
series . dataFields . valueY = " value " ;
series . dataFields . dateX = " date " ;
series . tooltipText = " {dateX}: [b]{valueY}[/] " ;
var regseries = chart . series . push ( new am4charts . LineSeries ());
regseries . dataFields . valueY = " value " ;
regseries . dataFields . dateX = " date " ;
regseries . strokeWidth = 2 ;
regseries . name = " Linear Regression " ;
regseries . plugins . push ( new am4plugins_regression . Regression ());
var regseries2 = chart . series . push ( new am4charts . LineSeries ());
regseries2 . dataFields . valueY = " value " ;
regseries2 . dataFields . dateX = " date " ;
regseries2 . strokeWidth = 2 ;
regseries2 . name = " Polynomial Regression " ;
regseries2 . tensionX = 0.8 ;
regseries2 . tensionY = 0.8 ;
var reg2 = regseries2 . plugins . push ( new am4plugins_regression . Regression ());
reg2 . method = " polynomial " ;
chart . legend = new am4charts . Legend ();
chart . cursor = new am4charts . XYCursor ();
< div id = " chartdiv " ></ div >
-apple-system , BlinkMacSystemFont, " Segoe UI " , Roboto, Helvetica , Arial , sans-serif ,
" Apple Color Emoji " , " Segoe UI Emoji " , " Segoe UI Symbol " ;
Regression trend lines regression-trend-lines-3
Normally, the plugin produce and intermediate data point for each data point in source data it was calculated for.
However, if you are using linear regression, it’s a straight line, so just two data points should do: one for the beginning and the other for the end of the trend line.
You can enable such simplification using simplify property:
{ // ... "series": [{ // ... }, { // ... "plugins": [{ "type": "Regression", "simplify": true }] }]}
While having no effect on visual appearance of the trend line, using such simplification might give a serious performance boost on data-heavy charts.
On scatter charts - where you have value axes on both X and Y - data points can come in any order. This might produce an odd-looking trend line. To fix that, you can use Regression’s reorder setting:
{ // ... "series": [{ // ... }, { // ... "plugins": [{ "type": "Regression", "reorder": true }] }]}
This will ensure that points in a trend line are arranged linearly.
Whenever Regression plugin is done calculating data, it will place it in its result property.
You can use "processed" event to find out when it’s ready:
reg2 . events . on ( " processed " , function ( ev ) { console . log (ev . target . result );});
reg2 . events . on ( " processed " , function ( ev ) { console . log ( ev . target . result );});
{ // ... "series": [{ // ... }, { // ... "plugins": [{ "type": "Regression", "method": "polynomial", "events": { "processed": function(ev) { console.log(ev.target.result); } } }] }]}
Run * ---------------------------------------
* This demo was created using amCharts 4.
* For more information visit:
* https://www.amcharts.com/
* Documentation is available at:
* https://www.amcharts.com/docs/v4/
* ---------------------------------------
am4core . useTheme ( am4themes_animated );
am4core . useTheme ( am4themes_dataviz );
var chart = am4core . create ( " chartdiv " , am4charts . XYChart );
date: new Date ( 2018 , 0 , 1 ),
date: new Date ( 2018 , 0 , 2 ),
date: new Date ( 2018 , 0 , 3 ),
date: new Date ( 2018 , 0 , 4 ),
date: new Date ( 2018 , 0 , 5 ),
date: new Date ( 2018 , 0 , 6 ),
date: new Date ( 2018 , 0 , 7 ),
var categoryAxis = chart . xAxes . push ( new am4charts . DateAxis ());
categoryAxis . renderer . grid . template . location = 0 ;
categoryAxis . renderer . minGridDistance = 30 ;
var valueAxis = chart . yAxes . push ( new am4charts . ValueAxis ());
var series = chart . series . push ( new am4charts . ColumnSeries ());
series . dataFields . valueY = " value " ;
series . dataFields . dateX = " date " ;
series . tooltipText = " {dateX}: [b]{valueY}[/] " ;
var regseries = chart . series . push ( new am4charts . LineSeries ());
regseries . dataFields . valueY = " value " ;
regseries . dataFields . dateX = " date " ;
regseries . strokeWidth = 2 ;
regseries . name = " Linear Regression " ;
regseries . plugins . push ( new am4plugins_regression . Regression ());
var regseries2 = chart . series . push ( new am4charts . LineSeries ());
regseries2 . dataFields . valueY = " value " ;
regseries2 . dataFields . dateX = " date " ;
regseries2 . strokeWidth = 2 ;
regseries2 . name = " Polynomial Regression " ;
regseries2 . tensionX = 0.8 ;
regseries2 . tensionY = 0.8 ;
var reg2 = regseries2 . plugins . push ( new am4plugins_regression . Regression ());
reg2 . method = " polynomial " ;
var label = chart . tooltipContainer . createChild ( am4core . Label );
label . x = am4core . percent ( 100 );
reg2 . events . on ( " processed " , function ( ev ) {
ev . target . result . string . replace ( / \^ 2 / , " ² " ) +
chart . legend = new am4charts . Legend ();
chart . cursor = new am4charts . XYCursor ();
< div id = " chartdiv " ></ div >
-apple-system , BlinkMacSystemFont, " Segoe UI " , Roboto, Helvetica , Arial , sans-serif ,
" Apple Color Emoji " , " Segoe UI Emoji " , " Segoe UI Symbol " ;
Regression trend lines regression-trend-lines-4