d3.js

d3.jsで棒グラフを描く その2(スケール)

はじめに

d3.jsで棒グラフを描く その1の続きです。
前回作成したプログラムにスケールを適用します。
表示領域の高さが100として、100以上の値を持つ棒グラフを表示するとしたら、どうするでしょうか。全体が高さ100以内に収まるよう比率で値を求めますよね。スケールは、実際のデータを表示領域に合った値へ変換してくれる仕組みです。

スケール

スケールを宣言します。domainに変換前の値の最小値と最大値を設定し、rangeに変換後の値の最小値と最大値を設定します。
このスケールを使うと、5は50、10は100に変換してくれます。

// スケールの宣言
var H = 100;

var scale = d3.scale.linear()
              .domain([0, 10])
              .range([0, H]);

スケールの適用

高さを設定していたところを、先ほど宣言したscale関数に置き換えます。

svg.selectAll("rect")
    .data(dataset)
    .enter()
    .append("rect")
    .attr("x", function(d, i) {
      // dがデータ、iが添え字
      // 棒グラフのx開始点をずらす
      // 棒グラフがくっつかないようにする
      return i * (BAR_W + 1);
    })
    .attr("y", function(d, i) {
      // 開始点を全体高さから高さを引いた値とする
      //return H - d[1] * 10;
      return H - scale(d[1]);
    })
    .attr("width", BAR_W)
    .attr("height", function(d) {
      // データ配列の1コ目を高さとする
      // わかりにくいので、値を10倍
      // return d[1] * 10;
      return scale(d[1]);
    })
    // グラフの色設定
    .attr("style", "fill:turquoise");

// テキストの追加
svg.selectAll("text")
    .data(dataset)
    .enter()
    .append("text")
    .text(function(d) {
      return d[1];
    })
    .attr("text-anchor", "middle")
    .attr("x", function(d, i) {
      return i * (BAR_W + 1) + 10;
    })
    .attr("y", function(d) {
      //return H - d[1] * 10 + 15;
      return H - scale(d[1]) + 15;
    })
    .attr("font-size", "10px")
    .attr("fill", "white");

ここまでを実行
見た目は変わりませんが、スケールを使って表示をしています。

高さを変えてみましょう。

//var H = 100;
var H = 200;

ここまでを実行
全体が崩れることなく、高さを変更できました。
次は、d3.jsで棒グラフを描く その3で、軸を追加します。