D3.jsで動的にグラフをどんどん作り出す

D3.jsで動的にグラフをどんどん作り出す:

D3.jsを初めて勉強してグラフを作ったので、それを振り返るって意味でまとめます。

ドットインストールを参考に作成しました。


完成形

画像ではわかりませんが、グラフの1本1本にアニメーションがついてます。



_Users_kei_Desktop_test_js_dot_bar.html.png



完成形コード

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> 


参考サイト

https://dotinstall.com/lessons/basic_d3js_v2

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)