How to add an average line to a graph in chartjs?

0

Here is an example of a graphic I made:

var data_labels = ['Tue Jul 04 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Wed Jul 05 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Thu Jul 06 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Fri Jul 07 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sat Jul 08 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sun Jul 09 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Mon Jul 10 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Tue Jul 11 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Wed Jul 12 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Thu Jul 13 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Fri Jul 14 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sat Jul 15 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sun Jul 16 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Mon Jul 17 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Tue Jul 18 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Wed Jul 19 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Thu Jul 20 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Fri Jul 21 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sat Jul 22 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sun Jul 23 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)'];

var data_data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1];

var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: data_labels,
        datasets: [
            {
                label: '# de Equipos con Paradas de Mantenimiento',
                data: data_data,
                borderWidth: 1,
                backgroundColor: 'rgba(60, 141, 188, 0.2)',
                borderColor: 'rgba(60, 141, 188,1)'
            },
        ]
    },
    options: {
        tooltips: {
            callbacks: {
                labelColor: function(tooltipItem, chart) {
                    return {
                        backgroundColor: 'rgba(60, 141, 188, 0.2)',
                        borderColor: 'rgba(60, 141, 188,1)'
                    }
                },
                label: function(tooltipItem, data) {
                    return '#: '+tooltipItem.yLabel;
                }
            }
        },
        scales: {
            xAxes: [{
                type: 'time',
                time: {
                    displayFormats: {
                        quarter: 'DD MMM YYYY'
                    },
                    tooltipFormat: 'DD [de] MMM [de] YYYY', 
                },
                stacked: true,
                ticks: {
                    fontSize: 10,
                    //maxRotation: 50, // angle in degrees
                },
            }],
            yAxes: [{
                stacked: true,
                ticks: {
                    fontSize: 10,
                    maxRotation: 0, // angle in degrees
                    stepSize: 1
                },
            }]
        },
        elements: {
            line: {
                tension: 0,
            }
        },
        animation: {
            duration: 500, // general animation time
        },
        hover: {
            animationDuration: 500, // duration of animations when hovering an item
        },
        responsiveAnimationDuration: 500, // animation duration after a resize
    }
});
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/locale/es.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>

<canvas id="myChart" style="height: 180px; width: 633px;" height="180" width="633"></canvas>

I would like to add an average line like the following:

    
asked by Pablo Contreras 26.07.2017 в 18:39
source

1 answer

1

I added a bit of functionality to your graph, I do not know if it's exactly what you're looking for, but more or less combining graphs and doing some calculations based on average data lapses.

Revised to see if you can use it:

var data_labels = ['Tue Jul 04 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Wed Jul 05 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Thu Jul 06 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Fri Jul 07 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sat Jul 08 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sun Jul 09 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Mon Jul 10 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Tue Jul 11 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Wed Jul 12 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Thu Jul 13 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Fri Jul 14 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sat Jul 15 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sun Jul 16 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Mon Jul 17 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Tue Jul 18 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Wed Jul 19 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Thu Jul 20 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Fri Jul 21 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sat Jul 22 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)', 'Sun Jul 23 2017 00:00:00 GMT-0400 (Hora estándar oeste, Sudamérica)'];

var data_data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1];

var data_promedio = [];// [0, null, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1];

var sum = 0 ;
var len = data_data.length;
var lapso = 5;//Moviendo este lapso se mueve la linea, se va sacando el promedio entre ese lapso de puntos
var promedios = []
var sumLapso =0;
var countLapso = 0;
$.each(data_data, function(i,v){
  countLapso = countLapso + 1;
  if(i == 0 || i== (data_data.length -1)){
    data_promedio.push(v);
  }else{
    data_promedio.push(null);
  }
  if(i%lapso == 0){
    promedios.push(sumLapso/(countLapso ==0 ? 1 : countLapso));
    countLapso = 0;
    sumLapso = 0;
    sumLapso = v;
    //sum1 =sum1 + v;
    //count1 = count1 + 1;
  }else{  
    sumLapso = sumLapso + v;
    //sum2 =sum2 + v;
    //count2 = count2 + 1;
  }
  //console.log(v);
  sum = sum + v;
});

$.each(promedios, function(i,v){
  console.log(v);
  if(i == 0 || i== (promedios.length -1)){
    data_promedio[i] = v;
  }else{
    data_promedio[i+lapso] = v;
  }
});

//console.log(sum + ' ' + sum1 + ' ' + sum2);
//console.log(len + ' ' + count1 + ' ' + count2);
/*
var prom = sum / data_data.length;

data_promedio[0] = prom-1;
data_promedio[data_data.length -1] = prom;
console.log(prom);
*/
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: data_labels,
        datasets: [ {
                label: 'Promedio',
                data: data_promedio,
                type: 'line',
                lineTension: .6,
                pointRadius: 0,
                fill: false,
                spanGaps: true,
                borderColor: 'rgba(255, 0, 0, 0.5)'
            },
            {
                label: '# de Equipos con Paradas de Mantenimiento',
                data: data_data,
                borderWidth: 1,
                backgroundColor: 'rgba(60, 141, 188, 0.2)',
                borderColor: 'rgba(60, 141, 188,1)'
            }
        ]
    }
    ,
    options: {
        tooltips: {
            callbacks: {
                labelColor: function(tooltipItem, chart) {
                    return {
                        backgroundColor: 'rgba(60, 141, 188, 0.2)',
                        borderColor: 'rgba(60, 141, 188,1)'
                    }
                },
                label: function(tooltipItem, data) {
                    return '#: '+tooltipItem.yLabel;
                }
            }
        },
        scales: {
            xAxes: [{
                type: 'time',
                time: {
                    displayFormats: {
                        quarter: 'DD MMM YYYY'
                    },
                    tooltipFormat: 'DD [de] MMM [de] YYYY', 
                },
                stacked: true,
                ticks: {
                    fontSize: 10,
                    //maxRotation: 50, // angle in degrees
                },
            }]
            /*,//Comente esta parte porque hace que la linea de promedio aparezca mas arriba
            yAxes: [{
                stacked: true,
                ticks: {
                    fontSize: 10,
                    maxRotation: 0, // angle in degrees
                    stepSize: 1
                },
            }]*/
        }
        ,
        elements: {
            line: {
                tension: 0,
            }
        },
        animation: {
            duration: 500, // general animation time
        },
        hover: {
            animationDuration: 500, // duration of animations when hovering an item
        },
        responsiveAnimationDuration: 500, // animation duration after a resize
    }
});
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/locale/es.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>

<canvas id="myChart" style="height: 180px; width: 633px;" height="180" width="633"></canvas>
    
answered by 26.07.2017 / 20:30
source