[76] | 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 | } |
---|