D3でCSVファイルを読み込む

      D3でCSVファイルを読み込む はコメントを受け付けていません

これまではhtmlファイルに読み込むデータを記述していましたが、扱うデータが増えていくと、htmlファイルへの記述ではコードが読みにくくなってしまいます。ここでは、データの記述方法として一番シンプルなCSVファイルを読み込みビジュアルとして表示する方法を学びます。

ローカルサーバの利用

テキストファイルをd3で読み込むにはwebサーバを利用する必要があります。ここでは、パソコン上で構築できる簡単なサーバを紹介します。

1. ターミナルを開く

ターミナルは、macの標準のアプリケーションで、windowsのコマンドプロンプトのようにテキストを打ってmacの操作を行う環境です。アプリケーションフォルダ>ユーティリティ>ターミナルを開いてください。

2. サーバにしたいフォルダを登録

まず、デスクトップにtestServerというフォルダを作り、ターミナルでcdと打ってから作成したtestServerフォルダをターミナルにドラッグします。すると、そのフォルダのパスが表示されます。

例:cd /Users/yasushi/Desktop/testServer


リターンを押してtestServerフォルダに移動します。

3. サーバを起動する

python -m http.server 8888
と打ってリターンキーを押します。


サーバが起動します。


このサーバ上のhtmlファイルをブラウザで表示するには、以下のURLを打ち込んで、フォルダ内のファイルを表示してください。

http://localhost:8888

4. サーバを終了する場合

ターミナル上でコントロール+Cを押して終了します。

データフォーマット

一般的に膨大なデータを視覚化する際には、ファイルからデータを読み込んでからプログラム上で数値を形態、色彩、運動、インタラクションに変換します。この項では、データベースを扱うときに使われる代表的なデータフォーマット(形式)を学習します。

XLS(XLSX)

Microsoft Excelなどで使われているフォーマットですが、これもデータベースのフォーマットと言えます。テーブルに保存しますが、Excel上で操作しやすいのが強みです。

CSV (comma-separated values)

データ同士がカンマで区切られているだけの、非常に単純な構造をしているデータ形式です。現状、インターネット上で入手できるデータは、この形式になっていることが多いといえます。

XML (Extensible Markup Language)

比較的歴史の浅いフォーマットですが、インターネットの発展とともに広まってきました。記述形式はHTMLとも良く似ています。この形式でデータを公開している公共機関も少なくありません。

JSON (JavaScript Object Notation)

現在主流のフォーマットです。XMLとも似ていますが、一般的にXMLよりも高速に処理が可能といわれています。特にインターネットで広く利用されています。

それぞれに特徴がありますが、ここではCSV形式のデータを読み込んで視覚化をおこなってみます。

ツールチップ付きの棒グラフを改変する

サーバの準備ができたので、すでに作成したツールチップ付きの棒グラフを改変しましょう。以下のファイルをダウンロードしてください。

以下のCSVファイルもダウンロードして、htmlファイルと同じ階層に置いてください。

都道府県別の人口は以下から引用しました。
https://www.stat.go.jp/data/nihon/02.html

都道府県別の人口を棒グラフにするので、表示画面を大きくします。
datasetは必要ないので削除し、csvファイルを読み込む関数で既存のコードを囲ってください。

var w = 600;
var h = 350;
 
//csvファイル読み込み
//参照元:https://www.stat.go.jp/data/nihon/02.html
d3.csv("japan_pref.csv").then(function(dataset){
 
既存のコード
 
});


yScaleの最大値は前のコードのdatasetではなく、populationであることを明示する必要があるので、以下のように変更します。

var yScale = d3.scaleLinear()
            .domain([0, d3.max(dataset, function(d){
               return parseInt(d.population);
            })])
            .rangeRound([0, h]);


rectのy座標、高さ、色は、人口を入力データとして使うので、以下のように変更します。ここで、d.populationは文字列として読み込まれいるため、このままでは数値として認識されません。parseIntを使って文字列から数値に変換します。

svg.selectAll("rect")
   .data(dataset)
   .enter()
   .append("rect")
   .attr("x", function(d, i) {
       return xScale(i);
   })
   .attr("y", function(d) {
         //populationをyScaleで変換
         return h - yScale(parseInt(d.population));
   })
   .attr("width", xScale.bandwidth())
   .attr("height", function(d) {
      return yScale(parseInt(d.population));
   })
   .attr("fill", function(d) {
      //yScale(parseInt(d.population))の最大値は画面の高さ(h)なので、
      //0〜1の範囲になり、255をかけると0~255になる
      return "rgb(0, 0, " + (yScale(parseInt(d.population)) / h * 255) + ")";
   })


htmlのdivタグは以下のように書き換えましょう。

<div id="tooltip" class="hidden">
   <p class="pref"><strong>Label Name</strong></p>
   <p><span class="population">0</span>人</p>
</div>


マウスオーバーイベントの中は以下のように書き換えます。

.on("mouseover", function(event, d) {
      d3.select(this)
         .attr("fill", "red");

   //選択されたDOM要素(ここではdiv)の座標を取得。
   var xPosition = parseFloat(d3.select(this).attr("x")) + xScale.bandwidth() / 2;
   var yPosition = parseFloat(d3.select(this).attr("y")) + 14;

   //tooltipラベルを作成
   d3.select("#tooltip")
      .style("left", xPosition + "px")
      .style("top", yPosition + "px")
      .select(".pref")
      .text(d.pref);

   d3.select("#tooltip")
      .select(".population")
      .text(d.population);

   //tooltipを表示
   d3.select("#tooltip").classed("hidden", false);
})


マウスアウトのコードは以下のように色を変更します。

.on("mouseout", function(event, d) {
   d3.select(this)
      .transition()
      .duration(250)
      .attr("fill", "rgb(0, 0, " + (yScale(parseInt(d.population)) / h * 255) + ")");

   //tooltipを隠す
   d3.select("#tooltip").classed("hidden", true);
})