最近すっかりグラフ厨になってるんですが、ちょっとした解析ツールとかにグラフあったらいいなーなんて思う事ありますよね?

webアプリで使うならjsでグラフ書けると色々使い勝手がいいんですけど、毎回どのライブラリがいいかなー?と悩む訳ですよ。Highcharts.jsは格好いいけど、商用利用は有料だし・・しかも結構高いし・・

そんな中、「これでFAで良いんじゃないの?」ってのがあったので紹介してみます。

dygraphs.jsといいます。他にも幾つかライブラリを試してみたんですが、これはかなりシンプルに書けるわりに、高機能だったのが良かった。なかなか書き方の参考になりそうなところ見つからなかったので、幾つかサンプル残しておこうと思います。

一番シンプルなグラフ

こんな感じに書くだけです。データはCSV形式でシンプルな受け渡し。

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  container = document.getElementById("graphdiv");
  g = new Dygraph(container,
    "Date,Temperature\n" +
    "20121128,12\n" +
    "20121129,16\n" +
    "20121130,14\n" +
    "20121201,12\n" +
    "20121202,9\n" +
    "20121203,13\n" +
    "20121204,14\n"
  );
</script>

デフォルトでドラック&ドロップで範囲を絞ることができます。

複数行のケース

複数のグラフ書くのは、CSVに列追加するだけ。

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  container = document.getElementById("graphdiv");
  g = new Dygraph(container,
    "Date,Tokyo,NewYork\n" +
    "20121128,12,5\n" +
    "20121129,16,6\n" +
    "20121130,14,6\n" +
    "20121201,12,6\n" +
    "20121202,9,8\n" +
    "20121203,13,12\n" +
    "20121204,14,10\n"
  );
</script>

沢山のデータ表示

ベタに書かなくてもcsvファイルを指定することも可能

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  container = document.getElementById("graphdiv");
  g = new Dygraph(container,"graph3.csv");
</script>

使ったCSVはこんな感じです

Date,Data1,Data2,Data3,Data4,Data5,Data6,Data7,Data8,Data9,Data10
20121120,0,0,0,0,0,875,25,80,3035,0
20121121,0,2575,0,2950,0,1775,0,250,5900,4475
20121122,0,5725,0,3000,0,2000,0,145,9510,9350
20121123,0,4325,0,2525,0,2000,0,150,7735,5375
20121124,0,3750,0,2425,0,1600,1150,165,7330,5175
20121125,0,3075,0,2000,0,800,2125,925,6885,4800
20121126,0,2400,0,1400,0,675,1800,1485,6350,4275
20121127,0,2100,125,1525,0,2725,1250,1150,5950,3200
20121128,0,2475,1625,1125,0,2885,1350,1140,5725,2775
20121129,0,2525,1805,775,1510,2425,1650,820,5290,2575
20121130,560,2125,2050,800,3020,2650,975,880,5865,2900
20121201,975,1900,1840,850,2510,2525,700,1130,5320,2525
20121202,1000,1650,1810,750,2810,2325,1825,900,5330,2250
20121203,1200,1900,2020,700,2785,2575,1075,935,4690,2375
20121204,1075,2025,1860,700,2045,2425,1225,720,5065,2100

より複雑な例

上のケースだとデータ量が多すぎて視認性が悪いので、色々オプションを加えます

  1. グラフのハイライト
  2. クリック時のハイライト固定
  3. ラベルリストの外だし
  4. データのオン/オフスイッチ
  5. レンジセレクタ

色々触ったりクリックしたりすると感じが解ると思います。

若干コードが長くなりますが、一つ一つはシンプルです。CSVは上の例からヘッダ行とっただけ(ラベルの外だしするため)。

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  // クリック時に実行されるcallback、ハイライトを固定する
  var makeClickCallback = function(graph) {
    var isLocked = false;
    return function(ev) {
      if (isLocked) {
        graph.clearSelection();
        isLocked = false;
      } else {
        graph.setSelection(graph.getSelection(), graph.getHighlightSeries(), true);
        isLocked = true;
      }
    };
  };

  // グラフ描画ロジック
  container = document.getElementById("graphdiv");
  labels = document.getElementById("labels");
  labels_arr = ['Date','Data1','Data2','Data3','Data4','Data5','Data6','Data7','Data8','Data9','Data10'];
  g = new Dygraph(
    container,
    "graph4.csv",
    {
       labels: labels_arr, // ラベル名指定
       labelsDiv: labels,  // ラベル表示位置
       showRangeSelector: true, // 表示範囲セレクターを表示
       labelsSeparateLines: true, // ラベルの後ろに改行挟む
       highlightSeriesOpts: {  // ハイライトの設定
         strokeWidth: 3,
         strokeBorderWidth: 1,
         highlightCircleSize: 5
       }
  });
  // クリック時のcallback指定
  g.updateOptions({clickCallback: makeClickCallback(g)}, true);

  // 表示非表示切り替え
  function change(el) {
    g.setVisibility(parseInt(el.id), el.checked);
  }
</script>

コールバックや表示切り替え部分はそのまま流用できるし、その他はオプションだけで設定できます。ライブラリ自体がかなり大きくて、他にも色々な機能があるのでデモを見ると解ると思います。ここで紹介した以外に、グラフの特定箇所に記しをつけるannotationなんかを使っています。

デモが幾つか分散していて、ギャラリータイプのと独立しているものがあります。お目当てを探すのが面倒なのですが、始めにざっと見て何ができるか把握すると良さそうです。

オススメです。