Chart.js로 회귀 직선 그리기

소개



R과 Python + matplotlib에서는 쉽게 그릴 수있는 회귀 직선을 JavaScript의 그래프 라이브러리 "Chart.js"로 그립니다.
다음은 산점도를 그리는 데이터에서 회귀식을 구하여 회귀 직선을 그리는 샘플입니다.



샘플


<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>cahrt.jsで回帰直線を描くサンプル</title>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.js"></script>
</head>
<body>
<!-- グラフ描画エリア設定 -->
<div style="width:100%">
  <canvas id="canvas"></canvas>
</div>

<script>
// 散布図データ
var sample = [
  {x:1, y:4},{x:2, y:3},{x:3, y:4},{x:4, y:5},{x:5, y:6},{x:6, y:5},{x:7, y:7},{x:8, y:6},{x:9, y:8},{x:10, y:7}
];


// 回帰直線の傾きと切片を求める
var sx = 0;
var sy = 0;
var sxy = 0;
var sxsq = 0;
var xmean;
var ymean;
var alpha;
var beta;
var n;

sample.forEach(function(val) {
  sx += val.x;
  sy += val.y;
  sxy += val.x * val.y;
  sxsq += Math.pow(val.x,2);
});

n = sample.length;
xmean = sx/n;
ymean = sy/n;
beta  = ((n*sxy) - (sx*sy))/((n*sxsq)-(Math.pow(sx,2))); // 傾き
alpha = ymean - (beta * xmean); // 切片


// 回帰式より、回帰直線描画用データを作成
var regressionLinePlot = [];
sample.forEach(function(val) {
  regressionLinePlot.push({'x': val.x, 'y': alpha + beta*val.x});
});


// 散布図と回帰直線を描画
window.onload = function() {
  var ctx = document.getElementById("canvas").getContext("2d");
  window.myChart = new Chart(ctx, {
    type: 'scatter',
    data: plotData,
  });
};


// 描画データ
var plotData = {
  datasets: [
    { // 散布図
      type: 'scatter',
      label: 'scatter',
      data: sample,
      borderColor : 'rgba(100,120,255,1)',            // プロットの線の色
      backgroundColor: 'rgba(130,160,255,1)',         // 凡例の背景色
      pointBackgroundColor: 'rgba(100,120,255,1)',    // 点の色
      fill: false                                     // 線とX軸で囲まれた範囲の描画
    },
    { // 回帰直線
      type: 'scatter',
      label: 'Regression line',
      data: regressionLinePlot,              // 始点と終点のデータ(座標)
      borderColor : 'rgba(20,100,20,1)',     // 線の色
      backgroundColor: 'rgba(70,100,70,1)',  // 凡例の背景色
      borderWidth : 2,                       // 線幅
      pointRadius: 0.5,                      // 点の形状の半径(0にすると点を描画しない)
      tension: 0,                            // 線を直線にする
      showLine: true,                        // 線を描画
      fill: false                            // 線とX軸で囲まれた範囲の描画
    }
  ],
};
</script>
</body>
</html>

좋은 웹페이지 즐겨찾기