Линии тренда

Обзор

А линия тренда — это линия, наложенная на диаграмму, показывающая общее направление данных. Google Charts может автоматически создавать линии тренда для точечных диаграмм, гистограмм, столбчатых и линейных диаграмм.

Google Charts поддерживает три типа линий тренда: линейные, полиномиальные и экспоненциальные.

Линейные линии тренда

А линейный Линия тренда — это прямая линия, которая наиболее точно соответствует данным на графике. (Если быть точным, это линия, которая минимизирует сумму квадратов расстояний от каждой точки до нее.)

На диаграмме ниже вы можете увидеть линейную линию тренда на точечной диаграмме, сравнивающую возраст сахарных кленов с диаметром их стволов. Вы можете навести курсор на линию тренда, чтобы увидеть уравнение, рассчитанное с помощью Google Charts: 4,885, умноженное на диаметр + 0,730.

Чтобы нарисовать линию тренда на диаграмме, используйте опцию trendlines и укажите, какой ряд данных использовать:

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

Линейные линии тренда являются наиболее распространенным типом линий тренда. Но иногда кривая лучше всего подходит для описания данных, и для этого нам понадобится другой тип линии тренда.

Экспоненциальные линии тренда

Если ваши данные лучше всего объясняются экспонентой формы e ax+b , вы можете использовать атрибут type для указания экспоненциальный линия тренда, как показано ниже:

Примечание. В отличие от линейных линий тренда, существует несколько различных способов расчета экспоненциальных линий тренда. Сейчас мы предоставляем только один метод, но в будущем будем поддерживать больше, поэтому вполне возможно, что имя или поведение текущей экспоненциальной линии тренда изменится.

Для этой диаграммы мы также используем visibleInLegend: true для отображения экспоненциальной кривой в легенде.

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

Изменение цвета

По умолчанию линии тренда окрашены в тот же цвет, что и ряд данных, но светлее. Вы можете переопределить это с помощью атрибута color . Здесь мы показываем, сколько цифр π было рассчитано по годам в течение плодотворного в вычислительном отношении периода, окрашивая экспоненциальную линию тренда зеленым цветом.

Вот спецификация линий тренда:

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

Полиномиальные линии тренда

Чтобы сгенерировать полиномиальную линию тренда, задайте polynomial типа и degree . Используйте с осторожностью, поскольку иногда они могут привести к ошибочным результатам. В приведенном ниже примере примерно линейный набор данных построен с кубической линией тренда (степень 3):

Обратите внимание, что отвес после последней точки данных виден только потому, что мы искусственно расширили горизонтальную ось до 15. Без установки hAxis.maxValue в значение 15 это выглядело бы так:

Те же данные, тот же полином, другое окно данных.

Параметры
  var options = {
    title: 'Age vs. Weight comparison',
    legend: 'none',
    crosshair: { trigger: "both", orientation: "both" },
    trendlines: {
      0: {
        type: 'polynomial',
        degree: 3,
        visibleInLegend: true,
      }
    }
  };
Полный 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>

Изменение непрозрачности и ширины линии

Вы можете изменить прозрачность линии тренда, установив для opacity значение от 0,0 до 1,0, а ширину линии, установив параметр lineWidth .

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

Опции lineWidth будет достаточно для большинства применений, но если вам нравится внешний вид, есть опция pointSize , которую можно использовать для настройки размера выбираемых точек внутри линии тренда:

Точно так же, как свет — это и волна, и частица, линия тренда — это и линия, и группа точек. То, что видят пользователи, зависит от того, как они с ней взаимодействуют: обычно это линия, но когда они наводят курсор на линию тренда, конкретная точка будет выделена. Эта точка будет иметь диаметр, равный:

  • pointSize линии тренда, если она определена, иначе...
  • глобальный pointSize , если он определен, иначе...
  • 7

Однако если вы установите глобальную опцию или опцию pointSize линии тренда, будут показаны все доступные для выбора точки, независимо от lineWidth линии тренда.

Параметры
  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
<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>

Делаем точки видимыми

Линии тренда строятся путем нанесения на график множества точек. Опция pointsVisible линии тренда определяет, будут ли видны точки конкретной линии тренда. Опцией по умолчанию для всех линий тренда является true , но если вы хотите отключить видимость точки для вашей первой линии тренда, установите trendlines.0.pointsVisible: false .

На диаграмме ниже показано управление видимостью точек для каждой линии тренда.

Параметры
        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
<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>

    

Изменение этикетки

По умолчанию, если вы выберете visibleInLegend , метка отображает уравнение линии тренда. Вы можете использовать labelInLegend чтобы указать другую метку. Здесь мы отображаем линию тренда для каждой из двух серий, устанавливая в легенде метки «Линия ошибки» (для серии 0) и «Тестовая линия» (серия 1).

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

Корреляции

Коэффициент детерминации , называемый в статистике R 2 , определяет, насколько близко линия тренда соответствует данным. Идеальная корреляция равна 1,0, а идеальная антикорреляция — 0,0.

Вы можете отобразить R 2 в легенде вашей диаграммы, установив для опции showR2 значение 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>