Linhas de tendência

Visão geral

Uma linha de tendência é sobreposta em um gráfico que mostra a direção geral dos dados. Os gráficos do Google podem gerar automaticamente linhas de tendência para gráficos de dispersão, de barras, de colunas e de linhas.

Os Gráficos Google são compatíveis com três tipos de linhas de tendência: linear, polinomial e exponencial.

Linhas de tendência lineares

Uma linha de tendência linear é a linha reta que mais se aproxima dos dados no gráfico. Para ser mais preciso, é a linha que minimiza a soma das distâncias ao quadrado entre cada ponto e a linha.

No gráfico abaixo, há uma linha de tendência linear em um gráfico de dispersão comparando a idade da Acervo com o diâmetro dos troncos. Passe o cursor sobre a linha de tendência para ver a equação calculada pelo Google Charts: 4,885 vezes o diâmetro + 0,730.

Para desenhar uma linha de tendência em um gráfico, use a opção trendlines e especifique qual série de dados será usada:

google.charts.setOnLoadCallback(drawChart);
function drawChart() {
  var data = google.visualization.arrayToDataTable([
    ['Diameter', 'Age'],
    [8, 37], [4, 19.5], [11, 52], [4, 22], [3, 16.5], [6.5, 32.8], [14, 72]]);

  var options = {
    title: 'Age of sugar maples vs. trunk diameter, in inches',
    hAxis: {title: 'Diameter'},
    vAxis: {title: 'Age'},
    legend: 'none',
    trendlines: { 0: {} }    // Draw a trendline for data series 0.
  };

  var chart = new google.visualization.ScatterChart(document.getElementById('chart_div'));
  chart.draw(data, options);
}

As linhas de tendência lineares são o tipo mais comum. Mas, às vezes, uma curva é melhor para descrever dados e, para isso, precisaremos de outro tipo de linha de tendência.

Linhas de tendência exponenciais

Se for melhor explicar os dados com uma exponencial na forma eax+b, use o atributo type para especificar uma linha de tendência exponencial, conforme mostrado abaixo:

Observação:diferentemente das linhas de tendência lineares, há várias maneiras diferentes de calcular linhas de tendência exponenciais. No momento, fornecemos apenas um método, mas haverá mais suporte no futuro. Por isso, é possível que o nome ou comportamento da linha de tendência exponencial atual mude.

Neste gráfico, também usamos visibleInLegend: true para exibir a curva exponencial na legenda.

google.charts.setOnLoadCallback(drawChart);
function drawChart() {
  var data = google.visualization.arrayToDataTable([
    ['Generation', 'Descendants'],
    [0, 1], [1, 33], [2, 269], [3, 2013]
 ]);

  var options = {
    title: 'Descendants by Generation',
    hAxis: {title: 'Generation', minValue: 0, maxValue: 3},
    vAxis: {title: 'Descendants', minValue: 0, maxValue: 2100},
    trendlines: {
      0: {
        type: 'exponential',
        visibleInLegend: true,
      }
    }
  };

  var chart = new google.visualization.ScatterChart(document.getElementById('chart_div2'));
  chart.draw(data, options);
}

Como alterar a cor

Por padrão, as linhas de tendência têm a mesma cor das séries de dados, mas mais claras. É possível substituir isso pelo atributo color. Aqui, criamos um gráfico de quantos dígitos de π foram calculados por ano durante um período frutífero em termos computacionais, colorindo a linha de tendência exponencial verde.

Veja a especificação de linhas de tendência:

    trendlines: {
      0: {
        type: 'exponential',
        color: 'green',
      }
    }

Linhas de tendência polinomiais

Para gerar uma linha de tendência polinomial, especifique o tipo polynomial e um degree. Use com cuidado, já que eles podem levar a resultados enganosos. No exemplo abaixo, em que um conjunto de dados aproximadamente linear é plotado com uma linha de tendência cúbica (grau 3):

O plumímetro após o último ponto de dados só é visível porque estendemos artificialmente o eixo horizontal para 15. Sem definir hAxis.maxValue como 15, o resultado teria esta aparência:

Mesmos dados, mesmo polinômio, janela diferente sobre os dados.

Opções
  var options = {
    title: 'Age vs. Weight comparison',
    legend: 'none',
    crosshair: { trigger: "both", orientation: "both" },
    trendlines: {
      0: {
        type: 'polynomial',
        degree: 3,
        visibleInLegend: true,
      }
    }
  };
HTML completo
<html>
 <head>
   <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
   <script type="text/javascript">
     google.charts.load("current", {packages:["corechart"]});
     google.charts.setOnLoadCallback(drawChart);
     function drawChart() {
       var data = google.visualization.arrayToDataTable([
         ['Age', 'Weight'],
         [ 8,      12],
         [ 4,      5.5],
         [ 11,     14],
         [ 4,      5],
         [ 3,      3.5],
         [ 6.5,    7]
       ]);

       var options = {
         title: 'Age vs. Weight comparison',
         legend: 'none',
         crosshair: { trigger: 'both', orientation: 'both' },
         trendlines: {
           0: {
             type: 'polynomial',
             degree: 3,
             visibleInLegend: true,
           }
         }
       };

       var chart = new google.visualization.ScatterChart(document.getElementById('polynomial2_div'));
       chart.draw(data, options);
     }
   </script>
 </head>
 <body>
  <div id='polynomial2_div' style='width: 900px; height: 500px;'></div>
 </body>
</html>

Como alterar a opacidade e a largura da linha

É possível alterar a transparência da linha de tendência definindo opacity como um valor entre 0,0 e 1,0 e a largura da linha definindo a opção lineWidth.

    trendlines: {
      0: {
        color: 'purple',
        lineWidth: 10,
        opacity: 0.2,
        type: 'exponential'
      }
    }

A opção lineWidth é suficiente para a maioria dos usos, mas se você gostar da aparência, há uma opção pointSize que pode ser usada para personalizar o tamanho dos pontos selecionáveis dentro da linha de tendência:

Assim como a luz é uma onda e uma partícula, uma linha de tendência é uma linha e um monte de pontos. O que os usuários veem depende de como eles interagem com ela: normalmente uma linha, mas quando passarem o cursor sobre ela, um ponto específico será destacado. Esse ponto terá um diâmetro igual a:

  • na linha de tendência pointSize, se definida. Caso contrário...
  • o pointSize global se definido. Caso contrário...
  • 7

No entanto, se você definir a opção pointSize global ou de linha de tendência, todos os pontos selecionáveis serão mostrados, independente do lineWidth da linha de tendência.

Opções
  var options = {
    legend: 'none',
    hAxis: { ticks: [] },
    vAxis: { ticks: [] },
    pointShape: 'diamond',
    trendlines: {
      0: {
        type: 'polynomial',
        degree: 3,
        visibleInLegend: true,
        pointSize: 20, // Set the size of the trendline dots.
	opacity: 0.1
      }
    }
  };
HTML completo
<html>
  <head>
  <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
  <script type="text/javascript">
    google.charts.load("current", {packages:["corechart"]});
    google.charts.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['X', 'Y'],
          [0, 4],
          [1, 2],
          [2, 4],
          [3, 6],
          [4, 4]
        ]);

        var options = {
          legend: 'none',
          hAxis: { ticks: [] },
          vAxis: { ticks: [] },
          colors: ['#703583'],
          pointShape: 'diamond',
          trendlines: {
            0: {
              type: 'polynomial',
              degree: 3,
              visibleInLegend: true,
              pointSize: 20, // Set the size of the trendline dots.
              opacity: 0.1
            }
          }
      };

      var chart = new google.visualization.ScatterChart(document.getElementById('chart_pointSize'));

      chart.draw(data, options);
    }
    </script>
  </head>
  <body>
    <div id="chart_pointSize" style="width: 900px; height: 500px;"></div>
  </body>
</html>

Como tornar os pontos visíveis

As linhas de tendência são formadas pela inserção de vários pontos no gráfico. A opção pointsVisible da linha de tendência determina se os pontos de uma linha de tendência específica são visíveis. A opção padrão para todas as linhas de tendência é true, mas se você quiser desativar a visibilidade do ponto da primeira linha de tendência, defina trendlines.0.pointsVisible: false.

O gráfico abaixo demonstra o controle da visibilidade dos pontos por linha de tendência.

Opções
        var options = {
          height: 500,
          legend: 'none',
          colors: ['#9575cd', '#33ac71'],
          pointShape: 'diamond',
          trendlines: {
            0: {
              type: 'exponential',
              pointSize: 20,
              opacity: 0.6,
              pointsVisible: false
            },
            1: {
              type: 'linear',
              pointSize: 10,
              pointsVisible: true
            }
          }
        };
    
HTML completo
<html>
  <head>
    <meta charset="utf-8"/>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {packages:['corechart']});
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['X', 'Y', 'Z'],
          [0, 4, 5],
          [1, 2, 6],
          [2, 4, 8],
          [3, 6, 10],
          [4, 4, 11],
          [5, 8, 13],
          [6, 12, 15],
          [7, 15, 19],
          [8, 25, 21],
          [9, 34, 23],
          [10, 50, 27]
        ]);

        var options = {
          height: 500,
          legend: 'none',
          colors: ['#9575cd', '#33ac71'],
          pointShape: 'diamond',
          trendlines: {
            0: {
              type: 'exponential',
              pointSize: 20,
              opacity: 0.6,
              pointsVisible: false
            },
            1: {
              type: 'linear',
              pointSize: 10,
              pointsVisible: true
            }
          }
        };

        var chart = new google.visualization.ScatterChart(document.getElementById('chart_div'));

        chart.draw(data, options);
      }
    </script>
  </head>
  <body>
    <div id="chart_div"></div>
  </body>
</html>

    

Como alterar o rótulo

Por padrão, se você selecionar visibleInLegend, o rótulo revelará a equação da linha de tendência. É possível usar labelInLegend para especificar um rótulo diferente. Aqui, exibimos uma linha de tendência para cada uma das duas séries, definindo os rótulos na legenda como "Linha de bug" (para a série 0) e "Linha de teste" (série 1).

    trendlines: {
      0: {
        labelInLegend: 'Bug line',
        visibleInLegend: true,
      },
      1: {
        labelInLegend: 'Test line',
        visibleInLegend: true,
      }
    }

Correlações

O coeficiente de determinação, chamado de R2 em estatística, identifica o grau de correspondência entre uma linha de tendência e os dados. Uma correlação perfeita é 1,0, e uma anticorrelação perfeita é 0,0.

Para descrever R2 na legenda do seu gráfico, defina a opção showR2 como true.

<html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['corechart']});
      google.charts.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Age', 'Weight'],
          [ 8,      12],
          [ 4,      5.5],
          [ 11,     14],
          [ 4,      5],
          [ 3,      3.5],
          [ 6.5,    7]
        ]);

        var options = {
          hAxis: {minValue: 0, maxValue: 15},
          vAxis: {minValue: 0, maxValue: 15},
          chartArea: {width:'50%'},
          trendlines: {
            0: {
              type: 'linear',
              showR2: true,
              visibleInLegend: true
            }
          }
        };

        var chartLinear = new google.visualization.ScatterChart(document.getElementById('chartLinear'));
        chartLinear.draw(data, options);

        options.trendlines[0].type = 'exponential';
        options.colors = ['#6F9654'];

        var chartExponential = new google.visualization.ScatterChart(document.getElementById('chartExponential'));
        chartExponential.draw(data, options);
      }
    </script>
  </head>
  <body>
    <div id="chartLinear" style="height: 350px; width: 800px"></div>
    <div id="chartExponential" style="height: 350px; width: 800px"></div>
  </body>
</html>