D3.js v4/v5 散布図(ScatterPlot)の書き方
D3で基本的なグラフ、散布図を書く方法を紹介します。
サンプルデモ
サンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>D3 Scatter Plot</title> <script src="https://d3js.org/d3.v5.min.js"></script> </head> <body> <script> // 1. データの準備 var dataset = [ [5, 20], [480, 90], [250, 50], [100, 33], [330, 95], [410, 12], [475, 44], [25, 67], [85, 21], [220, 88] ]; var width = 400; // グラフの幅 var height = 300; // グラフの高さ var margin = { "top": 30, "bottom": 60, "right": 30, "left": 60 }; // 2. SVG領域の設定 var svg = d3.select("body").append("svg").attr("width", width).attr("height", height); // 3. 軸スケールの設定 var xScale = d3.scaleLinear() .domain([0, d3.max(dataset, function(d) { return d[0]; })]) .range([margin.left, width - margin.right]); var yScale = d3.scaleLinear() .domain([0, d3.max(dataset, function(d) { return d[1]; })]) .range([height - margin.bottom, margin.top]); // 4. 軸の表示 var axisx = d3.axisBottom(xScale).ticks(5); var axisy = d3.axisLeft(yScale).ticks(5); svg.append("g") .attr("transform", "translate(" + 0 + "," + (height - margin.bottom) + ")") .call(axisx) .append("text") .attr("fill", "black") .attr("x", (width - margin.left - margin.right) / 2 + margin.left) .attr("y", 35) .attr("text-anchor", "middle") .attr("font-size", "10pt") .attr("font-weight", "bold") .text("X Label"); svg.append("g") .attr("transform", "translate(" + margin.left + "," + 0 + ")") .call(axisy) .append("text") .attr("fill", "black") .attr("x", -(height - margin.top - margin.bottom) / 2 - margin.top) .attr("y", -35) .attr("transform", "rotate(-90)") .attr("text-anchor", "middle") .attr("font-weight", "bold") .attr("font-size", "10pt") .text("Y Label"); // 5. プロットの表示 svg.append("g") .selectAll("circle") .data(dataset) .enter() .append("circle") .attr("cx", function(d) { return xScale(d[0]); }) .attr("cy", function(d) { return yScale(d[1]); }) .attr("fill", "steelblue") .attr("r", 4); </script> </body> </html> |
解説
こちらのチュートリアルで散布図を書く方法を詳しく紹介しています。このサンプルはチュートリアルに加え、上下左右のマージンの個別設定とラベルを追加しています。ここでは簡単に説明します。
1. データの準備
マージンを設定するために、オブジェクトを用意します。
1 |
var margin = { "top": 30, "bottom": 60, "right": 30, "left": 60 }; |
下側と左側は、軸を表示するため、マージンを大きめに設定しています。
2. SVG領域の設定
SVGの表示領域を設定します。
3. 軸スケールの設定
軸スケールを設定します。
1 |
d3.scaleLinear() |
はdomainで設定したレンジをrangeで設定したレンジに変換する関数を設定します。散布図上の座標を画面上のピクセル値に変換する関数を作成します。
4. 軸の表示
D3の関数d3.axisBottom()とd3.axisLeft()を使って軸要素を設定します。引数を軸スケールの設定で設定した関数とし、callで呼び出すことでSVG要素が自動的に追加されます。
1 2 3 4 5 6 7 8 9 10 |
var axisx = d3.axisBottom(xScale).ticks(5); var axisy = d3.axisLeft(yScale).ticks(5); svg.append("g") .attr("transform", "translate(" + 0 + "," + (height - margin.bottom) + ")") .call(axisx) svg.append("g") .attr("transform", "translate(" + margin.left + "," + 0 + ")") .call(axisy) |
.ticks()はメモリの数を制御するメソッドです。整数で設定します。
軸を呼び出した後、text要素で軸のラベルを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
.append("text") .attr("fill", "black") .attr("x", (width - margin.left - margin.right) / 2 + margin.left) .attr("y", 35) .attr("text-anchor", "middle") .attr("font-size", "10pt") .attr("font-weight", "bold") .text("X Label"); .append("text") .attr("fill", "black") .attr("x", -(height - margin.top - margin.bottom) / 2 - margin.top) .attr("y", -35) .attr("transform", "rotate(-90)") .attr("text-anchor", "middle") .attr("font-weight", "bold") .attr("font-size", "10pt") .text("Y Label"); |
“text-anchor”はテキストの位置揃えをするための属性で、”middle”で中央揃えを設定しています。それぞれ、軸にかぶらないように35pxずつ移動しています。
5. プロットの表示
プロットを”circle”要素で表示します。
まとめ
散布図は最もよく用いるグラフの一つです。詳しい作り方はチュートリアルにまとめていますのでそちらも参照いただければと思います。