ワードクラウドを作成したい。
d3-cloud で作成したという記事をいくつか見つけ、よさそうなので利用することにした。これにあたり、D3の現在のバージョン(v5)にあわせて試行錯誤した。
概要
できあがりイメージ
 
- ワードと頻度をJSON形式で受け取り、ワードクラウドを作成する
- クラウドは、
- ランダムで着色(v5のカラーチャートの範囲で)。
- ランダムでローテートさせる
 
実装
GitHub にサンプルがあるので、ご参考ください。
JavaScript
cloud.js
var DATA_FILE_PATH = './data/words.json'; // 読み込みデータファイル
var TARGET_ELEMENT_ID = '#cloud'; // 描画先
d3.json(DATA_FILE_PATH).then(function(data) { // v5
  var h = 490;
  var w = 600;
  var random = d3.randomIrwinHall(2);
  var countMax = d3.max(data, function(d){ return d.count} );
  var sizeScale = d3.scaleLinear().domain([0, countMax]).range([10, 100])
  var words = data.map(function(d) {
    return {
    text: d.word,
    size: sizeScale(d.count) //頻出カウントを文字サイズに反映
    };
  });
  d3.layout.cloud().size([w, h])
    .words(words)
    .rotate(function() { return (~~(Math.random() * 6) - 3) * 30; })
    .font("Impact")
    .fontSize(function(d) { return d.size; })
    .on("end", draw) //描画関数の読み込み
    .start();
  // wordcloud 描画
  function draw(words) {
    d3.select(TARGET_ELEMENT_ID)
      .append("svg")
        .attr("class", "ui fluid image") // style using semantic ui
        .attr("viewBox", "0 0 " + w + " " + h )  // ViewBox : x, y, width, height
        .attr("width", "100%")    // 表示サイズの設定
        .attr("height", "100%")   // 表示サイズの設定
      .append("g")
        .attr("transform", "translate(" + w / 2 + "," + h / 2 + ")")
      .selectAll("text")
        .data(words)
      .enter().append("text")
        .style("font-size", function(d) { return d.size + "px"; })
        .style("font-family", "Impact")
        .style("fill", function(d, i) { return d3.schemeCategory10[i % 10]; })
        .attr("text-anchor", "middle")
        .attr("transform", function(d) {
          return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
        })
        .text(function(d) { return d.text; });
  }
});
d3.json(DATA_FILE_PATH)でJSONファイルを読み込む。
読み込みが完了したら、(1)dataのMapを作り、(2)クラウドのレイアウトを決め、(3)描画する。
HTML
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>d3-cloud(v5)を用いたワードクラウドサンプル</title>
</head>
<body>
  <header></header>
  <DIV id="cloud"></DIV>
  <footer></footer>
  <!-- word cloud -->
  <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  <script type="text/javascript" src="js/d3.layout.cloud.js"></script>
  <script src="js/cloud.js"></script>
</body>
</html>
以下の順に読み込んでいる。
- d3ライブラリ(d3.v5.min.js。この例ではCDNで取得。)
- d3-cloudライブラリ(d3.layout.cloud.js。ダウンロード済。)
- 自作したjsファイル(cloud.js)
JSONデータ
words.json
[
	{"word":"イノシシ","count":9},
	{"word":"おにやんま","count":3},
	{"word":"ゆるっと","count":4},
	{"word":"映画","count":3},
                       ・・・
	{"word":"河津桜","count":2}
]
word と count のみ。好きな方法で作ってください。