【JavaScript】D3.js / TopoJSON / DataMaps [3] ~ DataMaps Custom Plugin編 [2] ~

サンプル

http://blogs.yahoo.co.jp/dk521123/35450674.html
の続き。

例3:地図上に積み上げ棒グラフ

* 負の値も対応
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script src="">http://d3js.org/d3.v3.js">
<script src="">http://d3js.org/topojson.v1.min.js">
<script src="datamaps.world.js"></script>
<div id="container" style="position: relative; width: 1000px; height: 800px;"></div>
<script>
var map = new Datamap({
  scope: 'world',
  element: document.getElementById('container'),
});

map.addPlugin('stackedBars', function(layer, dataset, options) {  
// hold this in a closure
var self = this;

// a class you'll add to the DOM elements
var className = 'bars';

var dataGroup = d3.nest()
    .key(function(d) { return d.city; })
    .entries(dataset);

// make a D3 selection.
var bars =
  layer
   .selectAll(className)
   .data(dataset, JSON.stringify);

var colors = d3.scale.category20c();

var yPositionForPositiveValue = 0;
var yPositionForNegativeValue = 0;

dataGroup.forEach(function(d, i) {
    bars
      .enter()
      .append('rect')
      .attr('class', className)
      .attr('width', options.barWidth)
      .attr('height', 0)
      .attr('x', function(datum) {
        return self.latLngToXY(datum.latitude, datum.longitude)[0];
      })
      .attr('y', function(datum) {
        return self.latLngToXY(datum.latitude, datum.longitude)[1];
      })
      .style('fill', function(datum) { return colors(datum.chartIndex); })
      // アニメーション効果
      .transition()
      .delay(500) // 0.5秒遅らせる
      .duration(1000) // 1秒間でアニメーションさせる
      .ease("bounce") // bounceの動きを指定する
      .attr("height", function(d) {
         return Math.abs(d.yVal);
      })
      .attr("y", function(datum) {
          if (datum.chartIndex === 0) {
             yPositionForPositiveValue = 0;
             yPositionForNegativeValue = 0;
          }
          
          if (datum.yVal >= 0) {
             // 正の値の場合
             yPositionForPositiveValue = yPositionForPositiveValue + datum.yVal;
             return self.latLngToXY(datum.latitude, datum.longitude)[1] - yPositionForPositiveValue;
          } else {
             // 負の値の場合
             var yPosition = self.latLngToXY(datum.latitude, datum.longitude)[1] + yPositionForNegativeValue;
             yPositionForNegativeValue = yPositionForNegativeValue + Math.abs(datum.yVal);
             return  yPosition;
          }
          
      });
   });
   
   // 基軸
   var ledge = 10;
   bars
      .enter()
      .append('line')
      .attr("x1", function(datum) {
         return self.latLngToXY(datum.latitude, datum.longitude)[0] - ledge;
      })
      .attr("y1", function(datum) {
         return self.latLngToXY(datum.latitude, datum.longitude)[1];
      })
      .attr("x2", function(datum) {
         return self.latLngToXY(datum.latitude, datum.longitude)[0] + options.barWidth + ledge;
      })
      .attr("y2", function(datum) {
         return self.latLngToXY(datum.latitude, datum.longitude)[1];
      })
      .attr("stroke", "gray")
      .attr("stroke-width", 1);
});

var dataset = [  
    {city: 'Tokyo', latitude: 35.686533327621, longitude: 139.69192653894, chartIndex: 0, yVal: 15 },
    {city: 'Tokyo', latitude: 35.686533327621, longitude: 139.69192653894, chartIndex: 1, yVal: 50 },
    {city: 'Tokyo', latitude: 35.686533327621, longitude: 139.69192653894, chartIndex: 2, yVal: 35 },
    {city: 'Sydney', latitude: -33.873793, longitude: 151.208054, chartIndex: 0, yVal: -25 },
    {city: 'Sydney', latitude: -33.873793, longitude: 151.208054, chartIndex: 1, yVal: -35 },
    {city: 'Sydney', latitude: -33.873793, longitude: 151.208054, chartIndex: 2, yVal: -40 },
    {city: 'Roma', latitude: 41.902784, longitude: 12.496366, chartIndex: 0, yVal: 10 },
    {city: 'Roma', latitude: 41.902784, longitude: 12.496366, chartIndex: 1, yVal: -20 },
    {city: 'Roma', latitude: 41.902784, longitude: 12.496366, chartIndex: 2, yVal: 30 },
];

map.stackedBars(dataset, {barWidth: 20});
</script>
</body>
</html>

関連記事

D3.js ~ 入門編 ~

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

D3.js / TopoJSON / DataMaps [3] ~ DataMaps Custom Plugin編 [1] ~

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