NVD3.js

綺麗なチャートを表示するのにnvd3.jsを使ってるんだけど、ハマリどころが多いのでメモ。

nvd3.org

追記> こちらにちゃんとしたdocumentがありました。 Nvd3 - reusable charts for D3.js

  • データは各シリーズでx値が一致して抜けがないように。抜けは0やnullで補完する。x値の順序も同じようにソートしておく。
  • chartのx,yメソッドで値のスケーリングや演算ができるが、おかしくなることも多いので、演算済みのデータを渡すのが吉。

    chart.x(function(d) { return d['x'] / 1000 })
    
  • 日付はUnix tampstampをm secでわたす。javascriptで以下のように希望のフォーマットに変換する。

    chart.xAxis.tickFormat(
      function(d) {return d3.time.format('%Y-%m-%d')(new Date(d));});
    
  • 色を変えたいときはjavascriptでcolorをインジェクトしたが、元データに埋め込んでも可。

    data[0]['color'] = '#00cc00';
    
  • グラフのサイズはsvgタグのサイズで指定(slimつかってます)

    div#qty 
      svg style="height:300px; width:100%;"
    
  • 要望: line chartで、ぬけてるポイントは飛ばして線をつなげてほしい。

  • slimのテンプレを貼っておく

      doctype html
      html
        head
          meta charset="utf-8"
          title NVD3.js template
          link href="nv.d3.css" rel="stylesheet"
          script src="d3.min.js"
          script src="nv.d3.min.js"
          javascript:
            d3.json('data.json', function(data) {
              nv.addGraph(function() {
                var chart = nv.models.multiBarChart()
                  .rotateLabels(-45)
                  .margin({top: 30, right: 100, bottom: 100, left: 100});
                chart.multibar.stacked(true);
                chart.xAxis
                     .tickFormat(function(d) {
                       return d3.time.format('%Y-%m-%d')(new Date(d));});
                chart.yAxis
                  .tickFormat(d3.format(',d'))
                  .axisLabel('Number');
                data[0]['color'] = '#00cc00';
                data[1]['color'] = '#ffcc00';
                data[2]['color'] = '#ff9900';
                data[3]['color'] = '#ff3300';
                d3.select('#chart svg')
                    .datum(data)
                    .call(chart);
                nv.utils.windowResize(chart.update);
                return chart;
              });
            });
        body
          span
            h2 style="text-align:center;" Test chart
          div#chart
            svg style="height:300px; width:100%;"