D3.jsで動的にグラフをどんどん作り出す
D3.jsで動的にグラフをどんどん作り出す:
D3.jsを初めて勉強してグラフを作ったので、それを振り返るって意味でまとめます。
ドットインストールを参考に作成しました。
画像ではわかりませんが、グラフの1本1本にアニメーションがついてます。
https://dotinstall.com/lessons/basic_d3js_v2
D3.jsを初めて勉強してグラフを作ったので、それを振り返るって意味でまとめます。
ドットインストールを参考に作成しました。
完成形
画像ではわかりませんが、グラフの1本1本にアニメーションがついてます。
完成形コード
bar.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>D3.js Practice</title> </head> <body> <svg width="600" height="240"> </svg> <script src="https://d3js.org/d3.v5.min.js"></script> <script> (function() { 'use strict'; var WIDTH = 600; var HEIGHT = 240; var padding = { top: 40, bottom: 40, left: 100, right: 40 } var scores = [ {name: 'A', score: 99}, {name: 'B', score: 200}, {name: 'C', score: 20}, {name: 'D', score: 300}, {name: 'E', score: 120} ] function update(data) { var bars = d3.select('svg').selectAll('rect').data(data); var xScale = d3.scaleLinear() .domain([0, d3.max(scores, function(d) { return d.score; })]) .range([0, WIDTH - padding.left - padding.right]) .nice(); var yScale = d3.scaleBand() .domain(scores.map(function(d) { return d.name; })) .range([0, HEIGHT - padding.top - padding.bottom]) .padding([0.1]); var color = d3.scaleOrdinal(d3.schemeCategory10); bars .enter() .append('rect') .merge(bars) .attr('x', padding.left) .attr('y' , function(d, i) { return yScale(d.name) + padding.top; }) .attr('width', 0) .attr('height', yScale.bandwidth()) .attr('fill', function(d, i) { // return 'hsla(' + i * 30 + ' , 60%, 60%, 0.7)'; return color(i); }) .transition() .duration(3000) .delay(function(d, i) { return i * 300; }) .ease(d3.easeElastic) .attr('width', function(d) { return xScale(d.score); }); bars .exit() .remove(); d3.selectAll('.axis').remove(); d3.select('svg') .append('g') .attr('class', 'axis') .attr( 'transform', 'translate(' + padding.left + ' , ' + (HEIGHT - padding.bottom) + ')' ) .call(d3.axisBottom(xScale)); d3.select('svg') .append('g') .attr('class', 'axis') .attr( 'transform', 'translate(' + padding.left + ' , ' + padding.top + ')' ) .call(d3.axisLeft(yScale)); } update(scores) })(); </script> </body> </html>
ここからコードの解説
bar.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>D3.js Practice</title> </head> <body> <!-- これが今回グラフを構成する唯一のhtml要素です。このsvg要素を動的に増やしていきます。 --> <svg width="600" height="240"> </svg> <!-- ここでD3.jsを読み込み --> <script src="https://d3js.org/d3.v5.min.js"></script> <script> (function() { // これでgoogleのコンソールで見たときにエラーの箇所が厳密にわかるようになるようです 'use strict'; //ここで要素の大きさ等を定義しています。(cssの部分) var WIDTH = 600; var HEIGHT = 240; var padding = { top: 40, bottom: 40, left: 100, right: 40 } //グラフで使用するデータを定義(ここはcsv読み込みもできるようです) var scores = [ {name: 'A', score: 99}, {name: 'B', score: 200}, {name: 'C', score: 20}, {name: 'D', score: 300}, {name: 'E', score: 120} ] //ここからupdateという関数を定義 function update(data) { //上にあるsvg要素を選択し、その中のrect要素を選択します。 var bars = d3.select('svg').selectAll('rect').data(data); //svg要素のx座標(横の動き)を設定しています。 var xScale = d3.scaleLinear() .domain([0, d3.max(scores, function(d) { return d.score; })]) .range([0, WIDTH - padding.left - padding.right]) .nice(); //svg要素のy座標(縦の動き)を設定しています。 var yScale = d3.scaleBand() .domain(scores.map(function(d) { return d.name; })) .range([0, HEIGHT - padding.top - padding.bottom]) .padding([0.1]); //色の定義(D3.jsで設定されているカラーバリエーションを使う) var color = d3.scaleOrdinal(d3.schemeCategory10); //ここからsvg要素を動的に作成しています。 bars //svg要素の作成 .enter() //svg要素の中にrect要素を追加 .append('rect') .merge(bars) //svg要素の縦と横の座標を設定 .attr('x', padding.left) .attr('y' , function(d, i) { return yScale(d.name) + padding.top; }) //svg要素の高さと幅を .attr('width', 0) .attr('height', yScale.bandwidth()) //svg要素の色をバラバラにする .attr('fill', function(d, i) { // return 'hsla(' + i * 30 + ' , 60%, 60%, 0.7)'; return color(i); }) //svg要素にアニメーションをかける .transition() .duration(3000) .delay(function(d, i) { return i * 300; }) .ease(d3.easeElastic) .attr('width', function(d) { return xScale(d.score); }); //上書きされたデータのあまり部分を自動で削除 bars .exit() .remove(); d3.selectAll('.axis').remove(); //グラフが画面から飛び出すので、いい感じに位置をずらす(横に) d3.select('svg') .append('g') .attr('class', 'axis') .attr( 'transform', 'translate(' + padding.left + ' , ' + (HEIGHT - padding.bottom) + ')' ) .call(d3.axisBottom(xScale)); //グラフが画面から飛び出すので、いい感じに位置をずらす(横に) d3.select('svg') .append('g') .attr('class', 'axis') .attr( 'transform', 'translate(' + padding.left + ' , ' + padding.top + ')' ) .call(d3.axisLeft(yScale)); } //ここまでupdateという関数を定義 //これまでの処理を全て実行! update(scores) })(); </script> </body> </html>
コメント
コメントを投稿