Linie trendu

Omówienie

Linia trendu to linia nałożona na wykres, która pokazuje ogólny kierunek danych. Wykresy Google mogą automatycznie generować linie trendu na wykresach punktowych, słupkowych, kolumnowych i liniowych.

Wykresy Google obsługują 3 typy linii trendu: liniowy, wielomianowy i wykładniczy.

Liniowe linie trendu

Liniowy linia trendu to linia prosta, która najbardziej odpowiada danym na wykresie. (precyzyjnie to ta linia minimalizuje sumę do kwadratu odległości od każdego punktu do niego).

Na wykresie poniżej widać liniową linię trendu na wykresie punktowym porównującym wiek klonów cukrowych z średnicą ich pni. Po najechaniu kursorem na linię trendu zobaczysz równanie obliczone przez Wykresy Google: 4,885 pomnożone przez średnicę + 0,730.

Aby narysować linię trendu na wykresie, użyj opcji trendlines i określ, której serii danych chcesz użyć:

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

Liniowe linie trendu to najpopularniejszy typ linii trendu. Czasami jednak do opisywania danych najlepiej nadaje się krzywa. Do tego potrzebujemy innego rodzaju linii trendu.

Wykładnicze linie trendu

Jeśli dobrze objaśnisz dane za pomocą funkcji wykładniczej postaci eax+b, możesz użyć atrybutu type do określenia wykładniczej linii trendu, jak pokazano poniżej:

Uwaga: w przeciwieństwie do liniowych linii trendu istnieje kilka różnych sposobów obliczania wykładniczych linii trendu. W tej chwili udostępniamy tylko jedną metodę, ale w przyszłości będziemy obsługiwać więcej, dlatego może się zmienić nazwa lub działanie bieżącej wykładniczej linii trendu.

W tym wykresie używamy też funkcji visibleInLegend: true do wyświetlania krzywej wykładniczej w legendzie.

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

Zmienianie koloru

Domyślnie linie trendu mają taki sam kolor jak seria danych, ale jaśniejszy. Możesz zastąpić to za pomocą atrybutu color. Tutaj przedstawiamy, ile cyfr liczby π zostało obliczonych w roku w okresie rentowności obliczeniowej. Kolorem linii trendu wykładniczego jest kolor zielony.

Specyfikacja linii trendu:

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

Wielomianowe linie trendu

Aby wygenerować wielomianową linię trendu, podaj typ polynomial i degree. Używaj ich z rozwagą, bo czasami mogą one prowadzić do wyników wprowadzających w błąd. W poniższym przykładzie prezentujemy przybliżony liniowy zbiór danych z sześcienną linią trendu (stopień 3):

Pamiętaj, że słupek za ostatnim punktem danych jest widoczny tylko dlatego, że sztucznie wydłużyliśmy oś poziomą do 15. Bez ustawienia hAxis.maxValue na 15 wyglądało to tak:

Te same dane, ten sam wielomian, różne okno danych.

Opcje
  var options = {
    title: 'Age vs. Weight comparison',
    legend: 'none',
    crosshair: { trigger: "both", orientation: "both" },
    trendlines: {
      0: {
        type: 'polynomial',
        degree: 3,
        visibleInLegend: true,
      }
    }
  };
Pełny kod HTML
<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>

Zmienianie przezroczystości i szerokości linii

Aby zmienić przezroczystość linii trendu, ustaw opacity na wartość od 0,0 do 1,0, a szerokość linii – opcję lineWidth.

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

Opcja lineWidth sprawdzi się w większości zastosowań, ale jeśli podoba Ci się wygląd, możesz skorzystać z opcji pointSize, która pozwala dostosować rozmiar kropek do wyboru na linii trendu:

Światło jest zarówno falą, jak i cząsteczką, a linia trendu to zarówno linia, jak i grupa punktów. To, co widzą użytkownicy, zależy od sposobu interakcji z nią – zwykle jest to linia, ale gdy najedzie na linię trendu, zostanie wyróżniony konkretny punkt. Punkt ten będzie miał średnicę równą:

  • linia trendu pointSize, jeśli jest określona, a w przeciwnym razie...
  • globalny pointSize, jeśli został określony, a w przeciwnym razie...
  • 7

Jeśli jednak ustawisz opcję pointSize lub linię trendu, wyświetlą się wszystkie punkty do wyboru, niezależnie od linii trendu lineWidth.

Opcje
  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
      }
    }
  };
Pełny kod HTML
<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>

Jak zapewnić widoczność punktów

Linie trendu tworzy się przez dodanie kilku kropek na wykresie. Opcja pointsVisible linii trendu określa, czy punkty na danej linii trendu są widoczne. Domyślna opcja dla wszystkich linii trendu to true, ale jeśli chcesz wyłączyć widoczność punktu dla pierwszej linii trendu, ustaw trendlines.0.pointsVisible: false.

Wykres poniżej pokazuje, jak kontrolować widoczność punktów w poszczególnych liniach trendu.

Opcje
        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
            }
          }
        };
    
Pełny kod HTML
<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>

    

Zmienianie etykiety

Domyślnie, jeśli wybierzesz visibleInLegend, etykieta pokazuje równanie linii trendu. Aby wskazać inną etykietę, możesz użyć elementu labelInLegend. Tutaj wyświetlamy linię trendu dla każdej z dwóch serii, ustawiając etykiety w legendzie na „Linia błędu” (dla serii 0) i „Linia testowa” (seria 1).

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

Korelacje

Współczynnik determinacji, nazywany w statystykach R2, wskazuje stopień dopasowania linii trendu do danych. Idealna korelacja to 1,0, a idealna antykorelacja to 0,0.

Symbol R2 możesz umieścić w legendzie wykresu, ustawiając opcję showR2 na 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>