d3.jsな日々

d3.jsでデータ可視化する際の覚書です

スケーリング:domainとrange

あるデータのスケーリングは、.domain().range()の組み合わせで行う。範囲[a,b]の入力を、範囲[p,q]の出力に変換するスケーリング関数の基本形は次の通り。

f:id:yasuda0404:20130422074339p:plain:h360

var scale = d3.scale.種類
          .domain([a,b])
            .range([p, q]);

.domain([a,b])は入力値の範囲、.range([p,q])は出力(描画)の範囲を指定する。

連続数に対するスケールの「種類」は次がある

種類 変換方法
linear 線形
log 常用対数(底は10)
pow 指数 肩は.exponent(x)で指定
sqrt 平方根 .pow().exponent(0.5)と同じ
quantize 連続な入力(domain)を離散的な出力(range)に変換
quantile カテゴリーに分類された入力を離散的に出力
threshold

あらかじめ入力データの範囲がわかっていない場合は、d3.max(), d3.min()関数を使う。

 .domain([ d3.min(dataset,function(d) {return d;})
                 d3.max(dataset, function(d) {return d;}) ]);


スケーリング関数を使って描画する例:

//Width and height
var w = 500;
var h = 100;
var dataset = [
   [5, 20], [480, 90], [250, 50], [100, 33], [330, 95],
   [410, 12], [475, 44], [25, 67], [85, 21], [220, 88]
 	 ];
//Create scale functions
var xScale = d3.scale.linear()
	.domain([0, d3.max(dataset, function(d) { return d[0]; })])
	.range([0, w]);
var yScale = d3.scale.linear()
	.domain([0, d3.max(dataset, function(d) { return d[1]; })])
	.range([h, 0]);
//Create SVG element
var svg = d3.select("body")
	.append("svg")
	.attr("width", w)
	.attr("height", h);
svg.selectAll("circle")
	.data(dataset)
	.enter()
	 .append("circle")
	 .attr("cx", function(d) {
		return xScale(d[0]);
	 })
	.attr("cy", function(d) {
		return yScale(d[1]);
	})
	.attr("r", function(d) {
		return Math.sqrt(h - d[1]);
	});

画面上は上端がY=0で、下端ほどY座標が大きくなるため、Yスケールは.range([h,0]) として対応している。