1分でわかるグラフ描画JavaScriptライブラリChart.jsの使い方

Chart.jsとは

グラフ描画JavaScriptライブラリ。定期的に更新する必要のあるグラフは画像ではなくChart.jsでグラフ描画すると更新の手間が減少する。

Chart.jsの使い方

HTMLファイル内にidの付いたcanvasタグを記述してCDNでChart.min.jsを読み込む。

<canvas id="myChart"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script>

あとはグラフを描画するJSを下記のように記述するだけだ。

0票のように単位を付ける場合はオプションのcallbackで追加する。

var ctx = document.getElementById('myChart');
var myChart = new Chart(ctx, {
  type: 'bar',
  data: {
    labels: ['赤党', '緑党', '青党'],
    datasets: [{
      label: '投票数',
      data: [10000, 5000, 7000],
      backgroundColor: [
        'rgba(255, 0, 0, 0.2)',
        'rgba(0, 255, 255, 0.2)',
        'rgba(0, 0, 255, 0.2)'
      ],
      borderColor: [
        'red',
        'green',
        'blue'
      ],
      borderWidth: 1
    }]
  },
  options: {
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero: true,
          callback: function(val) {
            return val + '票';
          }
        }
      }]
    }
  }
});

棒グラフ、折れ線グラフ、円グラフなど8種類ある。

基本的にグラフは0からはじめるものが多いので、見やすいようオプションのbeginAtZero: trueは常に付ける。

Chart.js 棒グラフのサンプル

円グラフを描画する

円グラフに変更したい場合はtypeをpieにする。

デフォルトだと円グラフのツールチップは設定したdataの数値を表示するが、円グラフの場合は%を使用したほうが都合が良いことが多いのでoptionsのtooltipsに下記のように設定しておくと良い。

ちなみに円グラフでbeginAtZeroは使用できない。

var ctx = document.getElementById('myChart');
var myChart = new Chart(ctx, {
  type: 'pie',
  data: {
    labels: ['赤党', '緑党', '青党'],
    datasets: [{
      label: '投票数',
      data: [10000, 5000, 7000],
      backgroundColor: [
        'rgba(255, 0, 0, 0.2)',
        'rgba(0, 255, 255, 0.2)',
        'rgba(0, 0, 255, 0.2)'
      ],
      borderColor: [
        'red',
        'green',
        'blue'
      ],
      borderWidth: 1
    }]
  },
  options: {
    tooltips: {
      callbacks: {
        label: function(item, data) {
          var dataset = data.datasets[item.datasetIndex];
          var total = dataset.data.reduce(function(prev, current) {
            return prev + current;
          });
          var current = dataset.data[item.index];
          var percentage = Math.floor(((current / total) * 100) + 0.5);
          return percentage + "%";
        }
      }
    }
  }
});

Chart.js 円グラフのサンプル

折れ線グラフを描画する

グラフはtypeを変更することで形式を変更できる。折れ線グラフに変更したい場合はtypeをlineにする。

棒グラフと異なり、折れ線グラフは1項目に複数のデータが必要なのでdatasetsを配列で下記のように分ける。

折れ線グラフが曲線で背景色が付いていると見づらいのでlineTension: 0, fill: falseで直線にして透過すると見やすくなる。

var ctx = document.getElementById('myChart');
var myChart = new Chart(ctx, {
  type: 'line',
  data: {
    labels: ['投票2015', '投票2016', '投票2017'],
    datasets: [{
      label: '赤党',
      data: [9000, 5000, 10000],
      borderColor: 'red',
      lineTension: 0,
      fill: false
    },
    {
      label: '緑党',
      data: [6000, 7000, 3000],
      borderColor: 'green',
      lineTension: 0,
      fill: false
    },
    {
      label: '青党',
      data: [1000, 3000, 7000],
      borderColor: 'blue',
      lineTension: 0,
      fill: false
    }]
  },
  options: {
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero: true,
          callback: function(val) {
            return val + '票';
          }
        }
      }]
    }
  }
});

Chart.js 折れ線グラフのサンプル

Chart.jsのアニメーション停止

いずれのグラフはいずれも動いているが、基本的にグラフにアニメーションは不要なのでoptionsにanimation: falseを指定して停止させた方が良いだろう。

var ctx = document.getElementById('myChart');
var myChart = new Chart(ctx, {
  type: 'line',
  data: {
    labels: ['投票2015', '投票2016', '投票2017'],
    datasets: [{
      label: '赤党',
      data: [9000, 5000, 10000],
      borderColor: 'red',
      lineTension: 0,
      fill: false
    },
    {
      label: '緑党',
      data: [6000, 7000, 3000],
      borderColor: 'green',
      lineTension: 0,
      fill: false
    },
    {
      label: '青党',
      data: [1000, 3000, 7000],
      borderColor: 'blue',
      lineTension: 0,
      fill: false
    }]
  },
  options: {
    animation: false,
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero: true,
          callback: function(val) {
            return val + '票';
          }
        }
      }]
    }
  }
});

Chart.js 折れ線グラフアニメーション停止サンプル