【D3.js】世界の主要20言語 使用人口グラフ(バブルチャート)
データはEthnologueのSummary by language sizeよりいただきました。
Language.csv
バブルチャート表示
バブルチャートを作成するのにPack Layoutを使用しています。
ヘルパー関数として、こちらの記事で作成した関数を使用しています。
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 85 86 87 88 89 90 91 92 93 94 |
d3.svg('Language.csv', function(csv){ var w = 800; var h = 800; var svg = d3.select('svg'); var data = { //csvデータを一つのchidrenとしてデータセットを作成 children:csv }; //各要素のattrの内容(変数にしておくとアップデートを行うときに便利) var circleAttr = { cx: F('x'), cy: F('y'), r: F('r') }; var labelAttr = { x: F('x'), y: F('y') }; var countAttr = { x: F('x'), y: F('y', ' + 20') }; var pack = d3.layout.pack().size([w,h]); //バブルチャートで使用するpackレイアウトオブジェクトを作成 var retSpeakers = function(d){ return d.Speakers }; //Speakersの値を返す関数 var reTotalCountries = function(d){ return d.TotalCountries }; //TotalCountriesの値を返す関数 var circleGroup = svg.selectAll("g") .data(pack.value(retSpeakers).nodes(data)) //データセットからspeakersの値を元にレイアウトを作成する .enter() .append("g") .filter(function(d){ return d.Speakers > 0; //speakersの値が無い要素(root)は描画しない }) ; var circle = circleGroup.append('circle') //各サークル作成 .attr({ class:F('name'), "fill-opacity":0.8, "stroke-width":1, fill: function(d){return (d.LangName==='日本語') ? "red" : " blue " ; }, //日本だけ赤く塗る stroke:function(d){return "white";}, }) .attr(circleAttr) var label = circleGroup.append('text') //ラベル(名称)作成 .attr({ fill: "white", "font-size": "12px", "text-anchor": "middle", "alignment-baseline": "middle" }) .attr(labelAttr) .text(F('LangName')) var count = circleGroup.append('text') //ラベル(数値)作成 .attr({ fill: "white", "font-size": "12px", "text-anchor": "middle", "alignment-baseline": "middle", }) .attr(countAttr) .text(F('Speakers', " / 1000000000 + '億人'")) //デフォルトは使用人口を表示 var title = svg.append('text') //タイトル .attr({ fill:'black', 'font-size':'24', x: 40, y: 100 }) .text('Speakers') var style1 = function() { //使用人口表示 circleGroup.data(pack.value(retSpeakers).nodes(data)); circle.transition().attr(circleAttr).duration(1000); label.transition().attr(labelAttr).duration(1000); count.transition().attr(countAttr).text(F('Speakers', " / 1000000000 + '億人'")).duration(1000); title.text('Speakers') } var style2 = function() { //使用国数表示 circleGroup.data(pack.value(reTotalCountries).nodes(data)); circle.transition().attr(circleAttr).duration(1000); label.transition().attr(labelAttr).duration(1000); count.transition().attr(countAttr).text(F('TotalCountries', " + 'ヶ国'")).duration(1000); title.text('Total Countries') } d3.select('body').on('click', toggle(style2, style1) ); //クリックでスタイル切り替え }); |
ちょっとだけ解説
1 2 3 |
var pack = d3.layout.pack().size([w,h]); pack.value(retSpeakers).nodes(data); console.log(pack.value(retSpeakers).nodes(data)); |
packオブジェクトは、表示するステージのサイズ(縦横)を指定してデータセットを渡すと、ステージ内に収まるように値のスケールを調整しx,y,r値を付加して返します。
r値に対応させるデータ項目はvalueメソッドで指定することができます。
circleを使用したグラフを作成するのに非常に便利なオブジェクトです。