Skip to content

Commit d7ae2b8

Browse files
committed
Add Crimean War stacked bar example.
1 parent 3be5716 commit d7ae2b8

2 files changed

Lines changed: 123 additions & 0 deletions

File tree

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Crimean War</title>
5+
<script type="text/javascript" src="../../d3.js"></script>
6+
<script type="text/javascript" src="../../d3.layout.js"></script>
7+
<script type="text/javascript" src="../../d3.time.js"></script>
8+
<script type="text/javascript" src="../../d3.csv.js"></script>
9+
<style type="text/css">
10+
11+
svg {
12+
width: 960px;
13+
height: 500px;
14+
border: solid 1px #ccc;
15+
font: 10px sans-serif;
16+
shape-rendering: crispEdges;
17+
}
18+
19+
</style>
20+
</head>
21+
<body>
22+
<script type="text/javascript">
23+
24+
var w = 960,
25+
h = 500,
26+
p = [20, 50, 30, 20],
27+
x = d3.scale.ordinal().rangeRoundBands([0, w - p[1] - p[3]]),
28+
y = d3.scale.linear().range([0, h - p[0] - p[2]]),
29+
z = d3.scale.ordinal().range(["lightpink", "darkgray", "lightblue"]),
30+
parse = d3.time.format("%m/%Y").parse,
31+
format = d3.time.format("%b");
32+
33+
var svg = d3.select("body").append("svg:svg")
34+
.attr("width", w)
35+
.attr("height", h)
36+
.append("svg:g")
37+
.attr("transform", "translate(" + p[3] + "," + (h - p[2]) + ")");
38+
39+
d3.csv("crimea.csv", function(crimea) {
40+
41+
// Transpose the data into layers by cause.
42+
var causes = d3.layout.stack()(["wounds", "other", "disease"].map(function(cause) {
43+
return crimea.map(function(d) {
44+
return {x: parse(d.date), y: +d[cause]};
45+
});
46+
}));
47+
48+
// Compute the x-domain (by date) and y-domain (by top).
49+
x.domain(causes[0].map(function(d) { return d.x; }));
50+
y.domain([0, d3.max(causes[causes.length - 1], function(d) { return d.y0 + d.y; })]);
51+
52+
// Add a group for each cause.
53+
var cause = svg.selectAll("g.cause")
54+
.data(causes)
55+
.enter().append("svg:g")
56+
.attr("class", "cause")
57+
.style("fill", function(d, i) { return z(i); })
58+
.style("stroke", function(d, i) { return d3.rgb(z(i)).darker(); });
59+
60+
// Add a rect for each date.
61+
var rect = cause.selectAll("rect")
62+
.data(Object)
63+
.enter().append("svg:rect")
64+
.attr("x", function(d) { return x(d.x); })
65+
.attr("y", function(d) { return -y(d.y0) - y(d.y); })
66+
.attr("height", function(d) { return y(d.y); })
67+
.attr("width", x.rangeBand());
68+
69+
// Add a label per date.
70+
var label = svg.selectAll("text")
71+
.data(x.domain())
72+
.enter().append("svg:text")
73+
.attr("x", function(d) { return x(d) + x.rangeBand() / 2; })
74+
.attr("y", 6)
75+
.attr("text-anchor", "middle")
76+
.attr("dy", ".71em")
77+
.text(format);
78+
79+
// Add y-axis rules.
80+
var rule = svg.selectAll("g.rule")
81+
.data(y.ticks(5))
82+
.enter().append("svg:g")
83+
.attr("class", "rule")
84+
.attr("transform", function(d) { return "translate(0," + -y(d) + ")"; });
85+
86+
rule.append("svg:line")
87+
.attr("x2", w - p[1] - p[3])
88+
.style("stroke", function(d) { return d ? "#fff" : "#000"; })
89+
.style("stroke-opacity", function(d) { return d ? .7 : null; });
90+
91+
rule.append("svg:text")
92+
.attr("x", w - p[1] - p[3] + 6)
93+
.attr("dy", ".35em")
94+
.text(d3.format(",d"));
95+
});
96+
97+
</script>
98+
</body>
99+
</html>

examples/crimea/crimea.csv

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
date,wounds,other,disease
2+
5/1854,0,95,105
3+
6/1854,0,40,95
4+
7/1854,0,140,520
5+
8/1854,20,150,800
6+
9/1854,220,230,740
7+
10/1854,305,310,600
8+
11/1854,480,290,820
9+
12/1854,295,310,1100
10+
1/1855,230,460,1440
11+
2/1855,180,520,1270
12+
3/1855,155,350,935
13+
4/1855,195,195,560
14+
5/1855,180,155,550
15+
6/1855,330,130,650
16+
7/1855,260,130,430
17+
8/1855,290,110,490
18+
9/1855,355,100,290
19+
10/1855,135,95,245
20+
11/1855,100,140,325
21+
12/1855,40,120,215
22+
1/1856,0,160,160
23+
2/1856,0,100,100
24+
3/1856,0,125,90

0 commit comments

Comments
 (0)