日頃のグラフの中でよく見かけるのが円グラフです。スマートフォンの販売シェアとかを表す時に使われます。円グラフの表示には、D3.jsに用意されたレイアウト機能を使います。D3.jsには描画機能はないですが、描画に必要なレイアウトの計算を行うために便利なレイアウト機能があります。下記の表は、D3.jsで利用できるレイアウト機能です。
種類 | 詳細 |
---|---|
Chord | コードレイアウト |
Cluster | クラスターレイアウト |
Force | 力学レイアウト |
Hierarchy | 階層化レイアウト |
Histgram | 度数分布図 |
Pack | パックレイアウト(Hierarchyの一種) |
Partition | パーティションレイアウト(Hierarchyの一種) |
Pie | 円レイアウト |
Stack | 積み上げレイアウト |
Tree | ツリーレイアウト(Hierarchyの一種) |
Treemap | ツリーマップレイアウト(Hierarchyの一種) |
レイアウト機能を利用すると複雑な計算をD3.jsで行うので、複雑なレイアウトも簡単に実現することができます。
サンプルコードの実行結果はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>D3.js 円グラフを表示してみる</title> <script src="../js/d3.js"></script> <style> svg{ width:320px; height:320px; border:2px solid red;} .pie{ fill:yellow; stroke:green} </style> </head> <body> <h2>円グラフを表示</h2> <svg id="graph"></svg> <script src="test.js"></script> </body> </html> |
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 |
var svgWidth = 320; // SVG要素の幅を設定 var svgHeight = 320; // SVG要素の高さを設定 /* 値を代入するデータセット (割合を示す) 数値の和が100である必要はないです。 データの個数と値から自動的に円グラフの扇形の 角度が計算されます。 */ var arrData =[50,25,12,6,3,2]; var pie = d3.layout.pie(); // 円グラフレイアウト var arc = d3.svg.arc() .innerRadius(0) // 円グラフの内径 .outerRadius(100); // 円グラフの外径 var pieElements = d3.select("#graph") .selectAll("path") // path要素を指定 .data( pie(arrData) ); // データを要素に連結 pieElements.enter() // データの数だけ繰り返し /* 棒グラフのときはrect要素でしたが、円グラフのときはpath要素を追加します。 円グラフの扇形はpathの座標で構成されるので、append("path")を指定します。 */ .append("path") // データの数だけpath要素を追加 /* path要素はd属性に表示に必要な座標データを設定します。 扇形の座標計算を設定するのがattr("d", arc )です。 arcは関数(オブジェクト)で、データセットから扇形の座標を計算して、 その結果を返却します。 */ .attr("class","pie") // CSSクラスを指定 .attr("d", arc) // 扇形を指定 // 円の表示位置を設定 .attr("transform","translate(" + svgWidth / 2 + ", " + svgHeight / 2 + ")"); //円グラフを中心に配置 |
D3.jsのレイアウト機能はd3オブジェクト内にあるlayoutオブジェクトに格納されています。円グラフの場合はpie()メソッドとして定義されており、d3.layout.pie()とすることでレイアウト機能を利用することができます。d3.layout.pie()は数値を返すのではなく関数(オブジェクト)を返します。この関数により扇形の座標計算をします。
円グラフを表示するには、ほかにも円グラフのサイズの情報が必要です。d3.layout.pie()で用意した関数では、扇形の座標を計算した結果を返しますが、円グラフ全体のサイズは計算されません。円グラフ全体の処理をしたいときは、d3.svg.arc()を使います。円グラフを表示するには半径の指定しなければなりません。この半径の指定はouterRadius()メソッドです。パラメーターには円グラフの半径を指定します。円蔵具の内径をinnerRadius()メソッドで指定することができます。内径を指定するとドーナッツ型の円グラフを表示することができます。
必要な数値が揃ったので、今まで通りdata()メソッドを使いデータセットと要素を連結します。ただ今回は、 data(pie(arrData))のとして、d3.layout.pie()を使って用意した扇形の計算を行う関数を呼んで処理しなければなりません。この処理を忘れると円グラフが表示されません。