LoginSignup
20
22

More than 3 years have passed since last update.

Chart.jsで横スクロール可能なグラフを作る

Posted at

概要

Chart.jsでは普通にグラフを作ると画面の幅に合わせて1つのデータ当たりのサイズをレスポンシブに調整して表示してくれます.

とても便利ですが,データの量が多いとかなり見づらくなってしまいます.

そこでデータ1つ当たりの横幅を固定して画面に収まりきらない分は横スクロールで見えるようにしようと思いましたが,かなり苦労したのでメモを残します.参考になれば幸いです.

完成図

今回は棒グラフが必要だったので,棒グラフを作成しました.
他の種類のグラフは試していませんが,データ構造が同じようなグラフなら上手くいくと思います.
スクリーンショット 2020-05-26 12.09.53.png
図の下にスクロールバーが描画され,スクロールバーを動かすとスクロールすることができます.
(右の方はラベルしか描画されていませんが,値を入れなかっただけなので気にしないでください.)

実行環境

ブラウザ: Google Chrome
Chart.js バージョン: 2.9.3
CDNを読み込んで使っています

<head>
  <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
</head>

HTML

まずhtmlがこちらです.

<div class="chartWrapper" style="position: relative; overflow-x: scroll;">
  <div class="chartContainer" style="height:200px;"> //高さは好きに設定
    <canvas id="chart" style="position: absolute; left: 0; top: 0;"></canvas>
  </div>
</div>

canvasを2つのdivで囲っています.

Javascript

続いてJavasciptがこちらです.

var xAxisLabelMinWidth = 15; // データ当たりの幅を設定
var data = [12, 19, 3, 5, 2];
var width = data.length*xAxisLabelMinWidth; // グラフ全体の幅を計算
document.getElementById('chart').style.width = width+"px"; // グラフの幅を設定
document.getElementById('chart').style.height = "200px"; //htmlと同じ高さを設定

var myChart = new Chart(document.getElementById('chart').getContext('2d'), {
    type: 'bar',
    data: {
      labels: ['a', 'b', 'c', 'd', 'e'],
        datasets: [{
            label: 'sample data',
            data: data,
        }]
    },
    options: {
        responsive: false, //trueにすると画面の幅に合わせて作図してしまう
    }
});

データ当たりの幅をまず設定して,そこからグラフ全体の幅を計算しています.
これによりデータごとの描画サイズを固定することができます.

完成

以上のコードで横スクロール可能な図を作成できると思います.

参考

https://stackoverflow.com/questions/39473991/how-to-make-a-chart-js-bar-chart-scrollable
https://stackoverrun.com/ja/q/10874652

これらを参考にしましたが,自分の環境ではうまくいかなかったので修正しています.

20
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
22