【JavaScript】D3.js ~ ツールチップを表示する ~

■ 表示させる方法

[1] HTMLのtitle属性を用いた方法
 => とりあえず表示させるなら、これでOK

[2] CSSとマウスイベントを用いた方法
 => マウスイベントは、イベント設定が可能な on() を利用する

補足:jQuery 'tipsy' を用いた方法について

http://blog.qaramell.com/hunzy/2121
にある「jQuery 'tipsy' を用いた方法」だが、IE11ではうまく表示されなかった

関連記事

 * tipsy については、以下の関連記事を参照のこと。
http://blogs.yahoo.co.jp/dk521123/35486224.html

jQuery 'tipsy' を用いたサンプル

http://bl.ocks.org/ilyabo/1373263
http://cpettitt.github.io/project/dagre-d3/latest/demo/hover.html
http://bl.ocks.org/mccannf/1629644
http://bl.ocks.org/Matthew-Weber/5484861

[1] HTMLのtitle属性を用いた方法

サンプル

<html>
<head>
<meta charset="UTF-8">
<style>
</style>
</head>
<body>
<script src="">http://d3js.org/d3.v3.js">
<script>
var dataset = [
    {graphLegend:"001", graphValue:10, graphColor:"LightPink"},
    {graphLegend:"002", graphValue:20, graphColor:"LightCyan"},
    {graphLegend:"003", graphValue:30, graphColor:"LightGoldenrodYellow"},
    {graphLegend:"004", graphValue:25, graphColor:"Aquamarine"},
    {graphLegend:"005", graphValue:10, graphColor:"MistyRose"}
];

var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2;

var arc = d3.svg.arc()
    .outerRadius(radius - 10)
    .innerRadius(0);

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.graphValue; });

 var tooltip = d3.select("body")
     .append("div")
     .style("position", "absolute")
     .style("z-index", "20")
     .style("visibility", "hidden");

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

  var g = svg.selectAll(".arc")
      .data(pie(dataset))
      .enter().append("g");
      
  // ★以下の2行だけ★
  g.append("title")
     .text(function(d){ return d.data.graphLegend + " : " + d.data.graphValue; })
      
  g.append("path")
      .attr("d", arc)
      .style("fill", function(d) { return d.data.graphColor; })
      // アニメーション効果
      .transition()
      .duration(1000) // 1秒間でアニメーションさせる
      .attrTween("d", function(d){
        var interpolate = d3.interpolate(
            { startAngle : 0, endAngle : 0 },
            { startAngle : d.startAngle, endAngle : d.endAngle }
        );
        return function(t){
            return arc(interpolate(t));
        }
      });
      
  g.append("text")
      .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
      .attr("dy", ".35em")
      .style("text-anchor", "middle")
      .text(function(d) { return d.data.graphLegend; });

</script>
</body>
</html>

[2] CSSとマウスイベントを用いた方法

サンプル

http://blogs.yahoo.co.jp/dk521123/35450750.html
のサンプルの例2にツールチップをつける
<!DOCTYPE html>
<html>
<head>
<script src="">http://mbostock.github.com/d3/d3.v2.js">
<title>Sample Stacked Bar Chart</title>  
<style>
.axis text {
font: 10px sans-serif;
}
.axis path, .axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}

// ★ここ★
div.tooltip {
  position: absolute;	
  text-align: center;	
  width: 60px;	
  height: 28px;		
  padding: 2px;	
  font: 12px sans-serif;	
  background: lightsteelblue;	
  border: 0px;					
  border-radius: 8px;
 /*  pointer-events: none;	This line needs to be removed */
	
}
</style>
</head>
<body>
<script type="text/javascript" >
function buildStackedBarChart(chartDataset) {
  var index = chartDataset[0].length;
  while (index--) {
    var positive = 0;
    var negative = 0;
    chartDataset.forEach(function(datum) {
      datum = datum[index];
      datum.size = Math.abs(datum.y);
      if (datum.y  <0)  {
        datum.y0 = negative;
        negative -= datum.size;
      } else {
        datum.y0 = positive = positive + datum.size;
      }
    })
  }
  chartDataset.extent= d3.extent(d3.merge(d3.merge(chartDataset.map(function(datum) {
    return datum.map(function(d) { return [d.y0, d.y0 - d.size]})}))));
  
  return chartDataset;
}

var dataset = [
  [{y:3},{y:6},{y:-3}],
  [{y:4},{y:-2},{y:-9}],
  [{y:10},{y:-3},{y:4}]
];

var height = 500;
var width = 500;
var margin = 10;
var colors = d3.scale.category10();
var xScale = d3.scale.ordinal()
  .domain(['abc','abc2','abc3'])
  .rangeRoundBands([margin, width - margin], .1)
var yScale = d3.scale.linear()
  .range([height - margin, 0 + margin]);
var xAxis = d3.svg.axis().scale(xScale).orient("bottom").tickSize(6, 0);
var yAxis = d3.svg.axis().scale(yScale).orient("left");

// ★ここ★
var tooltip = d3.select("body")
  .append("div")  // declare the tooltip div 
  .attr("class", "tooltip")              // apply the 'tooltip' class
  .style("opacity", 0);                  // set the opacity to nil

buildStackedBarChart(dataset);
yScale.domain(dataset.extent);

svg = d3.select("body")
  .append("svg")
  .attr("height", height)
  .attr("width", width)

svg.selectAll(".series")
  .data(dataset)
  .enter()
  .append("g")
  .classed("series", true)
  .style("fill", function(d, i) { return colors(i); })
  .selectAll("rect")
  .data(Object)
  .enter()
  .append("rect")
  .attr("x", function(d, i) { return xScale(xScale.domain()[i]); })
  .attr("y", function(d) { return yScale(d.y0)})
  .attr("height", function(d) { return yScale(0) - yScale(d.size)})
  .attr("width", xScale.rangeBand())
  // ★ここ★
  .on("mouseover", function(d) {
     tooltip.transition()
        .duration(500)
        .style("opacity", 0);
     tooltip.transition()
        .duration(200)
        .style("opacity", .9);
     tooltip.html(
        "<a href='#'>" + d.y + "</a><br/>")
        .style("left", (d3.event.pageX) + "px")
        .style("top", (d3.event.pageY - 5) + "px");
     tooltip.style("visibility", "visible");
   })
   .on("mousemove", function(d){return tooltip.style("top", (event.pageY-20)+"px").style("left",(event.pageX+10)+"px");})
   .on("mouseout", function(d){ return tooltip.style("visibility", "hidden");});

svg.append("g")
  .attr("class", "axis x")
  .attr("transform", "translate (0, " + yScale(0) + ")")
  .call(xAxis)

svg.append("g")
  .attr("class", "axis y")
  .attr("transform", "translate (" + (xScale(margin) - 10) + ", 0)")
  .call(yAxis)

</script>
</body>
</html>


関連記事

ツールチップを表示させる ~ tipsy の使用 ~

http://blogs.yahoo.co.jp/dk521123/35486224.html

D3.js ~ 入門編 ~

http://blogs.yahoo.co.jp/dk521123/35423681.html

D3.js ~ 積み上げ縦棒グラフを作成する ~

http://blogs.yahoo.co.jp/dk521123/35450750.html