これまではhtmlファイルに読み込むデータを記述していましたが、扱うデータが増えていくと、htmlファイルへの記述ではコードが読みにくくなってしまいます。ここでは、データの記述方法として一番シンプルなCSVファイルを読み込みビジュアルとして表示する方法を学びます。
ローカルサーバの利用
テキストファイルをd3で読み込むにはwebサーバを利用する必要があります。ここでは、パソコン上で構築できる簡単なサーバを紹介します。
1. ターミナルを開く
ターミナルは、macの標準のアプリケーションで、windowsのコマンドプロンプトのようにテキストを打ってmacの操作を行う環境です。アプリケーションフォルダ>ユーティリティ>ターミナルを開いてください。

2. サーバにしたいフォルダを登録
まず、デスクトップにtestServerというフォルダを作り、ターミナルでcdと打ってから作成したtestServerフォルダをターミナルにドラッグします。すると、そのフォルダのパスが表示されます。
1 | 例:cd /Users/yasushi/Desktop/testServer |
リターンを押してtestServerフォルダに移動します。

3. サーバを起動する
1 | python -m SimpleHTTPServer 8888 と打ってリターンキーを押します。 |
サーバが起動します。

このサーバ上のhtmlファイルをブラウザで表示するには、以下のURLを打ち込んで、フォルダ内のファイルを表示してください。
1 | http://localhost:8888 |
4. 終了する場合
1 | コントロール+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ファイルを読み込む関数で既存のコードを囲ってください。
1 2 3 4 5 6 7 8 9 10 | 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であることを明示する必要があるので、以下のように変更します。
1 2 3 4 5 | var yScale = d3.scaleLinear() .domain([0, d3.max(dataset, function(d){ return parseInt(d.population); })]) .rangeRound([0, h]); |
rectのy座標、高さ、色は、人口を入力データとして使うので、以下のように変更します。ここで、d.populationは文字列として読み込まれいるため、このままでは数値として認識されません。parseIntを使って文字列から数値に変換します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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タグは以下のように書き換えましょう。
1 2 3 4 | <div id="tooltip" class="hidden"> <p class="pref"><strong>Label Name</strong></p> <p><span class="population">0</span>人</p> </div> |
マウスオーバーイベントの中は以下のように書き換えます。
1 2 3 4 5 6 7 8 9 10 11 | //tooltipラベルを作成 //Update the tooltip position and value d3.select("#tooltip") .style("top", (d3.event.pageY - 20) + "px") .style("left", (d3.event.pageX + 10) + "px") .select(".pref") .text(d.pref); d3.select("#tooltip") .select(".population") .text(d.population); |
マウスアウトのコードは以下のように色を変更します。
1 2 3 4 5 | .on("mouseout", function(d) { d3.select(this) .transition() .duration(250) .attr("fill", "rgb(0, 0, " + (yScale(parseInt(d.population)) / h * 255) + ")"); |
