忘れないようにメモっとく

機械学習とかプログラミングとか。

D3.jsでインタラクティブな感じにする

下の棒グラフは前回のコードに、各イベントを実装したものです。 グラフ表示の際のアニメーションと、マウスオーバーしたときの動作を、D3.jsのtransition()とイベントリスナーを使って簡単に追加することができます。

transition()

ドキュメントはこちら

選択した要素のあとに.transition()を呼んで、アニメーション終了時の属性を指定しておくだけです(楽チン!)。 ちなみにアニメーション時間は、デフォルトで250msらしいので、適宜.duration()を使って調整します。

 svg.selectAll("rect")
.data(dataset)
.transition().delay(1500).duration(2000)
.attr("y", function(d) { return height-d*5 })
.attr("height", function(d) { return d*5 })

イベントリスナー

ドキュメントはこちら

イベントリスナーも選択した要素に対して、.on()を呼び出すだけです。今回はマウスオーバーとマウスアウトのイベントに対するアクションを実装しています。 他にも、click、submitなどのイベントを取得できます。

.on("mouseover", function() { 
    d3.select(this)
    .attr("fill", "rgb(39, 250, 102)")
    .attr("stroke", "green");
    })
.on("mouseout", function(d) { 
    d3.select(this)
    .attr("fill", "yellow")
    .attr("stroke", "orange")
    });

今回はてなブログに載せたコード↓↓↓

<script type="text/javascript", src="http://d3js.org/d3.v3.min.js"></script>
<svg id="svgRect"></svg>
<button id="transitionBtn">transition()</button>
<script type="text/javascript">
    var dataset = [ 5, 10, 15, 20, 25 ];
    var width = 50;
    var height = 150;
    
    var svg = d3.select("#svgRect").attr("height", 200).attr("width", 800);

    svg.selectAll("rect")
    .data(dataset)
    .enter()
    .append("rect")
    .attr("width", width)
    .attr("height", function(d) { return 0 })
    .attr("x", function(d, i) { return i*(width+5)+5 })
    .attr("y", function(d) { return height })
    .attr("fill", "yellow")
    .attr("stroke", "orange")
    .attr("stroke-width", "3")
    .on("mouseover", function() { d3.select(this)
              .attr("fill", "rgb(39, 250, 102)")
              .attr("stroke", "green");
    })
    .on("mouseout", function(d) { 
          d3.select(this)
          .attr("fill", "yellow")
          .attr("stroke", "orange")
    });
    
     svg.selectAll("rect")
    .data(dataset)
    .transition().delay(1500).duration(2000)
    .attr("y", function(d) { return height-d*5 })
    .attr("height", function(d) { return d*5 })


    d3.select("#transitionBtn").on("click", function() {
         svg.selectAll("rect")
        .data(dataset)        
        .attr("height", function(d) { return 0 })
        .attr("y", function(d) { return height })

         svg.selectAll("rect")
        .data(dataset)
        .transition().delay(0).duration(2000)
        .attr("y", function(d) { return height-d*5 })
        .attr("height", function(d) { return d*5 })
    });
</script>