toolkit/javascript/d3/examples/stream/stack.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 var n = 4, // number of layers
       
     2     m = 64, // number of samples per layer
       
     3     data = d3.layout.stack()(stream_layers(n, m, .1)),
       
     4     color = d3.interpolateRgb("#aad", "#556");
       
     5 
       
     6 var p = 20,
       
     7     w = 960,
       
     8     h = 500 - .5 - p,
       
     9     mx = m,
       
    10     my = d3.max(data, function(d) {
       
    11       return d3.max(d, function(d) {
       
    12         return d.y0 + d.y;
       
    13       });
       
    14     }),
       
    15     mz = d3.max(data, function(d) {
       
    16       return d3.max(d, function(d) {
       
    17         return d.y;
       
    18       });
       
    19     }),
       
    20     x = function(d) { return d.x * w / mx; },
       
    21     y0 = function(d) { return h - d.y0 * h / my; },
       
    22     y1 = function(d) { return h - (d.y + d.y0) * h / my; },
       
    23     y2 = function(d) { return d.y * h / mz; }; // or `my` to not rescale
       
    24 
       
    25 var vis = d3.select("#chart")
       
    26   .append("svg:svg")
       
    27     .attr("width", w)
       
    28     .attr("height", h + p);
       
    29 
       
    30 var layers = vis.selectAll("g.layer")
       
    31     .data(data)
       
    32   .enter().append("svg:g")
       
    33     .style("fill", function(d, i) { return color(i / (n - 1)); })
       
    34     .attr("class", "layer");
       
    35 
       
    36 var bars = layers.selectAll("g.bar")
       
    37     .data(function(d) { return d; })
       
    38   .enter().append("svg:g")
       
    39     .attr("class", "bar")
       
    40     .attr("transform", function(d) { return "translate(" + x(d) + ",0)"; });
       
    41 
       
    42 bars.append("svg:rect")
       
    43     .attr("width", x({x: .9}))
       
    44     .attr("x", 0)
       
    45     .attr("y", h)
       
    46     .attr("height", 0)
       
    47   .transition()
       
    48     .delay(function(d, i) { return i * 10; })
       
    49     .attr("y", y1)
       
    50     .attr("height", function(d) { return y0(d) - y1(d); });
       
    51 
       
    52 var labels = vis.selectAll("text.label")
       
    53     .data(data[0])
       
    54   .enter().append("svg:text")
       
    55     .attr("class", "label")
       
    56     .attr("x", x)
       
    57     .attr("y", h + 6)
       
    58     .attr("dx", x({x: .45}))
       
    59     .attr("dy", ".71em")
       
    60     .attr("text-anchor", "middle")
       
    61     .text(function(d, i) { return i; });
       
    62 
       
    63 vis.append("svg:line")
       
    64     .attr("x1", 0)
       
    65     .attr("x2", w - x({x: .1}))
       
    66     .attr("y1", h)
       
    67     .attr("y2", h);
       
    68 
       
    69 function transitionGroup() {
       
    70   var group = d3.selectAll("#chart");
       
    71 
       
    72   group.select("#group")
       
    73       .attr("class", "first active");
       
    74 
       
    75   group.select("#stack")
       
    76       .attr("class", "last");
       
    77 
       
    78   group.selectAll("g.layer rect")
       
    79     .transition()
       
    80       .duration(500)
       
    81       .delay(function(d, i) { return (i % m) * 10; })
       
    82       .attr("x", function(d, i) { return x({x: .9 * ~~(i / m) / n}); })
       
    83       .attr("width", x({x: .9 / n}))
       
    84       .each("end", transitionEnd);
       
    85 
       
    86   function transitionEnd() {
       
    87     d3.select(this)
       
    88       .transition()
       
    89         .duration(500)
       
    90         .attr("y", function(d) { return h - y2(d); })
       
    91         .attr("height", y2);
       
    92   }
       
    93 }
       
    94 
       
    95 function transitionStack() {
       
    96   var stack = d3.select("#chart");
       
    97 
       
    98   stack.select("#group")
       
    99       .attr("class", "first");
       
   100 
       
   101   stack.select("#stack")
       
   102       .attr("class", "last active");
       
   103 
       
   104   stack.selectAll("g.layer rect")
       
   105     .transition()
       
   106       .duration(500)
       
   107       .delay(function(d, i) { return (i % m) * 10; })
       
   108       .attr("y", y1)
       
   109       .attr("height", function(d) { return y0(d) - y1(d); })
       
   110       .each("end", transitionEnd);
       
   111 
       
   112   function transitionEnd() {
       
   113     d3.select(this)
       
   114       .transition()
       
   115         .duration(500)
       
   116         .attr("x", 0)
       
   117         .attr("width", x({x: .9}));
       
   118   }
       
   119 }