(d, i) => x(i)
や d => y(d)
は、D3.jsでよく使われるアロー関数を使ったコールバック関数です。これらは、データを基にした操作を行うために使われ、各データポイントに対して、どのようにプロパティ(位置やサイズなど)を計算するかを指定します。
基本的な仕組み
(d, i) => x(i)
の仕組み
-
d
は、データセットの中の 各データポイント(この場合、具体的な数値)です。 -
i
は、 各データポイントのインデックス(配列内の位置) を指します。
この関数は、各データに対応する要素のX座標を決定するために使われます。関数の返り値として x(i)
を返すので、i
(データのインデックス)を x
スケールに入力し、それに基づいて X座標が決まります。
d => y(d)
の仕組み
-
d
は、同じく 各データポイント です(データの具体的な値、例: 10, 20, 30など)。
d => y(d)
は、データの値に基づいてY座標を設定するための関数です。ここでは、d
(データの値)を y
スケールに入力し、その値に対応するY座標が決まります。
具体的な例
const data = [10, 20, 30, 40]; // データセット
このデータセットに基づいて、棒グラフのX座標とY座標を計算してみましょう。
1. x(i)
の具体例
const x = d3.scaleBand() // X軸のバンドスケール
.domain(d3.range(data.length)) // データの数に応じた範囲(0, 1, 2, 3)
.range([margin.left, width - margin.right])
.padding(0.1); // 棒同士の間隔を設定
この場合、x(i)
は、データのインデックスに基づいて棒グラフのX座標を設定します。たとえば、データが [10, 20, 30, 40]
である場合、インデックスは [0, 1, 2, 3]
です。
-
x(0)
は最初の棒(データ10)を配置するX座標を返します。 -
x(1)
は次の棒(データ20)のX座標を返します。
つまり、(d, i) => x(i)
は、i
というインデックスに基づいて、それぞれの棒のX座標を決定するための関数です。
2. y(d)
の具体例
const y = d3.scaleLinear() // Y軸の線形スケール
.domain([0, d3.max(data)]) // データの範囲(0からデータの最大値まで)
.range([height - margin.bottom, margin.top]);
この場合、y(d)
は、データの値に基づいてY座標を設定します。例えば、データが [10, 20, 30, 40]
である場合、y
スケールは次のように動作します:
-
y(10)
はデータ値10に対するY座標を返します。 -
y(20)
はデータ値20に対するY座標を返します。
なお、Y座標はスクリーンの座標系が上から下に増えるため、y(0)
がグラフの一番下を示し、y(d)
は d
が大きくなるほどY座標が上に移動するように設定されています(range()
の逆方向設定による)。
実際のコードでの使用例
svg.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("x", (d, i) => x(i)) // インデックス i に基づいて棒のX座標を設定
.attr("y", d => y(d)) // データ d に基づいて棒のY座標を設定
.attr("height", d => y(0) - y(d)) // データに基づいて棒の高さを設定
.attr("width", x.bandwidth()) // 棒の幅をバンド幅に基づいて設定
.attr("fill", "steelblue"); // 棒の色を設定
-
attr("x", (d, i) => x(i))
は、データのインデックスi
をx
スケールに入力し、その値を棒のX座標として使います。i
が 0, 1, 2, 3 と順番にスケールに適用され、棒が左から右に配置されます。 -
attr("y", d => y(d))
は、データの値d
をy
スケールに入力し、その値を棒のY座標として使います。d
が大きいほどY座標が上に上がります。 -
attr("height", d => y(0) - y(d))
は、棒の高さをy(0)
からy(d)
までの差分として設定します。これにより、データの値に応じた高さの棒が描画されます。
まとめ
-
(d, i) => x(i)
は、データのインデックスi
をx
スケールに渡し、各棒のX座標を決定します。 -
d => y(d)
は、データの値d
をy
スケールに渡し、各棒のY座標を決定します。
これらは、データの値やインデックスに基づいてグラフの各要素を適切な位置に配置するための関数です。