2種のデータをCSVファイルから読み込む

      2種のデータをCSVファイルから読み込む はコメントを受け付けていません

「D3でCSVファイルを読み込む」では、CSVファイルからデータを読み込んで表示することができました。ここではもう少し複雑なデータの視覚化を行ってみます。

1年間の気温の変化を可視化する

365日の気温の変化を色で可視化してみます。既に作成したcsv_import.htmlファイルを改変します。

CSVファイルは以下のデータを使用します。htmlファイルと同じ階層に置いてください。

366日分のバーを表示する必要があるので、表示画面の幅を1000ピクセルにします。

var w = 1000;
var h = 300;

CSVファイルのリンクを変更します。

d3.csv("weather_day.csv").then(function(dataset){
var xScale = d3.scaleBand()
   .domain(d3.range(dataset.length))   //datasetの数を計算
   .range([0, w])
   .paddingOuter(10);  //バーの外側のpadding。単位はバーの1本の幅(bandwidth)

//1番低い温度と高い温度を検索して、変数min、maxにいれる
var min = d3.min(dataset, function(d) { return parseFloat(d.temp);});   //1番低い温度を検出
var max = d3.max(dataset, function(d) { return parseFloat(d.temp);});   //1番高い温度を検出

//バーの色を決めるためのカラースケールを作る
//1番低い温度の場合に黒、1番高い温度の時に白になるようにする
var colorScale = d3.scaleLinear()
      .domain([min, max])
      .range([0, 255]);

xScaleを変更し、また、バーの色を決定するためのcolorScaleを作成します。

var xScale = d3.scaleBand()
   .domain(d3.range(dataset.length))   //datasetの数を計算
   .range([0, w])
   .paddingOuter(10);  //バーの外側のpadding。単位はバーの1本の幅(bandwidth)

//1番低い温度と高い温度を検索して、変数min、maxにいれる
var min = d3.min(dataset, function(d) { return parseFloat(d.temp);});   //1番低い温度を検出
var max = d3.max(dataset, function(d) { return parseFloat(d.temp);});   //1番高い温度を検出

//バーの色を決めるためのカラースケールを作る
//1番低い温度の場合に黒、1番高い温度の時に白になるようにする
var colorScale = d3.scaleLinear()
      .domain([min, max])
      .range([0, 255]);

rectのfillを書き換えて、colorScaleを使って色を決めます。fill以外はそのままです。

svg.selectAll("rect")
   .data(dataset)
   .enter()
   .append("rect")
   .attr("x", function(d, i) {
       return xScale(i);
   })
   .attr("y", 100)
   .attr("width", xScale.bandwidth())
   .attr("height", h)
   .attr("fill", function(d) {
      //既に作成したcolorScaleを使って色を決定する
      var c = colorScale(parseFloat(d.temp));
      return "rgb(" + c + "," + c + "," + c + ")";
   })

マウスアウトの部分のfillを変更します。

.on("mouseout", function(d) {

      d3.select(this)
         .transition()
         .duration(250)
         .attr("fill", function(d) {
            var c = colorScale(d.temp);
            return "rgb(" + c + "," + c + "," + c + ")";
      });

   //Hide the tooltip
   d3.select("#tooltip").classed("hidden", true);
});

ツールチップのインタラクションを変更し、body内のdivタグも変更します。

//tooltipラベルを作成
d3.select("#tooltip")
   .style("top", (d3.event.pageY - 20) + "px")
   .style("left", (d3.event.pageX + 10) + "px")
   .select(".date")
   .text(d.date);

d3.select("#tooltip")
   .select(".tempAndWind")
   .text(d.temp + "度");
<div id="tooltip" class="hidden">
   <p><strong class="date">Label Name</strong></p>
   <p><span class="tempAndWind">0</span></p>
</div>

温度が高い日は明るく、低い日は暗くなります。

新しいデータでグラフを更新する

次に、温度の表示から風速のデータに更新してみます。divタグの下にbuttonタグを追加します。

<div id="tooltip" class="hidden">
   <p><strong class="date">Label Name</strong></p>
   <p><span class="tempAndWind">0</span></p>
</div>

<button style="display:block;margin-bottom:10px;" id="changeToWind">風のデータ</button>

ボタンを押した時に風速のデータにするために、「温度」か「風速」かの状態を判定するために、変数tempOrWindを宣言します。

var w = 1000;
var h = 300;
var tempOrWind = "temp";

colorScaleで出力される値は色の指定に使われるため、range()ではなくrangeRound()を使って整数値にします。

//バーの色を決めるためのカラースケール
var colorScale = d3.scaleLinear()
      .domain([min, max])
      .rangeRound([0, 255]);

ボタンを押した時に、風のデータに置き換わるようにします。最終行に追加してください。

//データ更新ボタンをクリックしたとき
d3.select("#changeToWind")
.on("click",function(){

   tempOrWind = "wind";

   yScale = d3.scaleLinear()
   .domain([0, d3.max(dataset, function(d) { return parseFloat(d.wind);})])
   .range([0, h]);

   svg.selectAll("rect")
      .transition()  //アニメーション
      .duration(2000)   //時間(2秒-2000ミリセカンド)
      .attr("y", function(d) {
            //windをyScaleで変換
            return h - yScale(parseFloat(d.wind));
      })
      .attr("height", function(d) {
         return yScale(parseFloat(d.wind));
      })
      .attr("fill","blue");
});

バーをマウスアウトした時に、データが温度の場合と、風速に変更した後で、バーの色がそれぞれ変わるようにif文を使って書き換えます。

.on("mouseout", function(d) {

      d3.select(this)
         .transition()
         .duration(250)
         .attr("fill", function(d) {
            if(tempOrWind == "temp"){
               //既に作成したcolorScaleを使って色を決定する
               var c = colorScale(d.temp);
               return "rgb(" + c + "," + c + "," + c + ")";
            }else{
               return "blue";
            }
      });

   //Hide the tooltip
   d3.select("#tooltip").classed("hidden", true);
})

最後に、バーをマウスオーバーした時に表示する情報を変えるためにツールチップのコードを変更します。tempOrWindが”temp”の場合と”wind”の場合で、表示されるデータが変わります。

d3.select("#tooltip")
   .select(".tempAndWind")
   .text(function(){
      if(tempOrWind == "temp"){
         return d.temp + "度";
      }else if(tempOrWind == "wind"){
         return d.wind + "m/h";
      }
   });

「風のデータ」ボタンを押すと、情報が入れ替わります。

参考:以下のサンプルは、温度を色に変換しています。他のサンプルに比べるとちょっと難しいですが、参考にしてみてください。