A recreation of a Protovis example in D3 using the stack layout.
forked from mbostock's block: Stacked Bar Chart
A recreation of a Protovis example in D3 using the stack layout.
forked from mbostock's block: Stacked Bar Chart
date | total | disease | wounds | other | |
---|---|---|---|---|---|
4/1854 | 8571 | 1 | 0 | 5 | |
5/1854 | 23333 | 12 | 0 | 9 | |
6/1854 | 28333 | 11 | 0 | 6 | |
7/1854 | 28772 | 359 | 0 | 23 | |
8/1854 | 30246 | 828 | 1 | 30 | |
9/1854 | 30290 | 788 | 81 | 70 | |
10/1854 | 30643 | 503 | 132 | 128 | |
11/1854 | 29736 | 844 | 287 | 106 | |
12/1854 | 32779 | 1725 | 114 | 131 | |
1/1855 | 32393 | 2761 | 83 | 324 | |
2/1855 | 30919 | 2120 | 42 | 361 | |
3/1855 | 30107 | 1205 | 32 | 172 | |
4/1855 | 32252 | 477 | 48 | 57 | |
5/1855 | 35473 | 508 | 49 | 37 | |
6/1855 | 38863 | 802 | 209 | 31 | |
7/1855 | 42647 | 382 | 134 | 33 | |
8/1855 | 44614 | 483 | 164 | 25 | |
9/1855 | 47751 | 189 | 276 | 20 | |
10/1855 | 46852 | 128 | 53 | 18 | |
11/1855 | 37853 | 178 | 33 | 32 | |
12/1855 | 43217 | 91 | 18 | 28 | |
1/1856 | 44212 | 42 | 2 | 48 | |
2/1856 | 43485 | 24 | 0 | 19 | |
3/1856 | 46140 | 15 | 0 | 35 |
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
.axis text { | |
font: 10px sans-serif; | |
} | |
.axis line, | |
.axis path { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.axis--x path { | |
display: none; | |
} | |
</style> | |
<body> | |
<script src="//d3js.org/d3.v3.min.js"></script> | |
<script> | |
var causes = ["wounds", "other", "disease"]; | |
var parseDate = d3.time.format("%m/%Y").parse; | |
var margin = {top: 20, right: 50, bottom: 30, left: 20}, | |
width = 960 - margin.left - margin.right, | |
height = 500 - margin.top - margin.bottom; | |
var x = d3.scale.ordinal() | |
.rangeRoundBands([0, width]); | |
var y = d3.scale.linear() | |
.rangeRound([height, 0]); | |
var z = d3.scale.category10(); | |
var xAxis = d3.svg.axis() | |
.scale(x) | |
.orient("bottom") | |
.tickFormat(d3.time.format("%b")); | |
var yAxis = d3.svg.axis() | |
.scale(y) | |
.orient("right"); | |
var svg = d3.select("body").append("svg") | |
.attr("width", width + margin.left + margin.right) | |
.attr("height", height + margin.top + margin.bottom) | |
.append("g") | |
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
d3.tsv("crimea.tsv", type, function(error, crimea) { | |
if (error) throw error; | |
var layers = d3.layout.stack()(causes.map(function(c) { | |
return crimea.map(function(d) { | |
return {x: d.date, y: d[c]}; | |
}); | |
})); | |
x.domain(layers[0].map(function(d) { return d.x; })); | |
y.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice(); | |
var layer = svg.selectAll(".layer") | |
.data(layers) | |
.enter().append("g") | |
.attr("class", "layer") | |
.style("fill", function(d, i) { return z(i); }); | |
layer.selectAll("rect") | |
.data(function(d) { return d; }) | |
.enter().append("rect") | |
.attr("x", function(d) { return x(d.x); }) | |
.attr("y", function(d) { return y(d.y + d.y0); }) | |
.attr("height", function(d) { return y(d.y0) - y(d.y + d.y0); }) | |
.attr("width", x.rangeBand() - 1); | |
svg.append("g") | |
.attr("class", "axis axis--x") | |
.attr("transform", "translate(0," + height + ")") | |
.call(xAxis); | |
svg.append("g") | |
.attr("class", "axis axis--y") | |
.attr("transform", "translate(" + width + ",0)") | |
.call(yAxis); | |
}); | |
function type(d) { | |
d.date = parseDate(d.date); | |
causes.forEach(function(c) { d[c] = +d[c]; }); | |
return d; | |
} | |
</script> |