Skip to content

Instantly share code, notes, and snippets.

@polyjon
Last active November 9, 2017 18:17
Show Gist options
  • Save polyjon/cf39295b8ef0898f7e819946bf3410ed to your computer and use it in GitHub Desktop.
Save polyjon/cf39295b8ef0898f7e819946bf3410ed to your computer and use it in GitHub Desktop.
Stacked Bar Chart Transition (Working)
license: gpl-3.0

This stacked bar chart is constructed from a CSV file storing the populations of different states by age group. The chart employs conventional margins and a number of D3 features:

  • d3-dsv - load and parse data
  • d3-scale - x- and y-position, and color encoding
  • d3-format - SI prefix formatting (e.g., “10M” for 10,000,000)
  • d3-array - compute simple statistics (e.g., max)
  • d3-axis - display axes
  • d3-shape - computed stacked positions

forked from mbostock's block: Stacked Bar Chart

forked from anonymous's block: Stacked Bar Chart

forked from bclinkinbeard's block: Stacked Bar Chart

forked from anonymous's block: Stacked Bar Chart Transition (Working)

State Under 5 Years 5 to 13 Years 14 to 17 Years 18 to 24 Years 25 to 44 Years 45 to 64 Years 65 Years and Over Region
AL 310504 552339 259034 450818 1231572 1215966 641667 1
AK 52083 85640 42153 74257 198724 183159 50277 1
AZ 515910 828669 362642 601943 1804762 1523681 862573 1
AR 202070 343207 157204 264160 754420 727124 407205 1
CA 2704659 4499890 2159981 3853788 10604510 8819342 4114496 WestCoast
CO 358280 587154 261701 466194 1464939 1290094 511094 1
CT 211637 403658 196918 325110 916955 968967 478007 1
DE 59319 99496 47414 84464 230183 230528 121688 1
DC 36352 50439 25225 75569 193557 140043 70648 1
FL 1140516 1938695 925060 1607297 4782119 4746856 3187797 1
GA 740521 1250460 557860 919876 2846985 2389018 981024 1
HI 87207 134025 64011 124834 356237 331817 190067 1
ID 121746 201192 89702 147606 406247 375173 182150 1
IL 894368 1558919 725973 1311479 3596343 3239173 1575308 1
IN 443089 780199 361393 605863 1724528 1647881 813839 1
IA 201321 345409 165883 306398 750505 788485 444554 1
KS 202529 342134 155822 293114 728166 713663 366706 1
KY 284601 493536 229927 381394 1179637 1134283 565867 1
LA 310716 542341 254916 471275 1162463 1128771 540314 1
ME 71459 133656 69752 112682 331809 397911 199187 1
MD 371787 651923 316873 543470 1556225 1513754 679565 1
MA 383568 701752 341713 665879 1782449 1751508 871098 1
MI 625526 1179503 585169 974480 2628322 2706100 1304322 1
MN 358471 606802 289371 507289 1416063 1391878 650519 1
MS 220813 371502 174405 305964 764203 730133 371598 1
MO 399450 690476 331543 560463 1569626 1554812 805235 1
MT 61114 106088 53156 95232 236297 278241 137312 1
NE 132092 215265 99638 186657 457177 451756 240847 1
NV 199175 325650 142976 212379 769913 653357 296717 1
NH 75297 144235 73826 119114 345109 388250 169978 1
NJ 557421 1011656 478505 769321 2379649 2335168 1150941 1
NM 148323 241326 112801 203097 517154 501604 260051 1
NY 1208495 2141490 1058031 1999120 5355235 5120254 2607672 1
NC 652823 1097890 492964 883397 2575603 2380685 1139052 1
ND 41896 67358 33794 82629 154913 166615 94276 1
OH 743750 1340492 646135 1081734 3019147 3083815 1570837 1
OK 266547 438926 200562 369916 957085 918688 490637 WestCoast
OR 243483 424167 199925 338162 1044056 1036269 503998 1
PA 737462 1345341 679201 1203944 3157759 3414001 1910571 1
RI 60934 111408 56198 114502 277779 282321 147646 1
SC 303024 517803 245400 438147 1193112 1186019 596295 1
SD 58566 94438 45305 82869 196738 210178 116100 1
TN 416334 725948 336312 550612 1719433 1646623 819626 1
TX 2027307 3277946 1420518 2454721 7017731 5656528 2472223 1
UT 268916 413034 167685 329585 772024 538978 246202 1
VT 32635 62538 33757 61679 155419 188593 86649 1
VA 522672 887525 413004 768475 2203286 2033550 940577 1
WA 433119 750274 357782 610378 1850983 1762811 783877 WestCoast
WV 105435 189649 91074 157989 470749 514505 285067 1
WI 362277 640286 311849 553914 1487457 1522038 750146 1
WY 38253 60890 29314 53980 137338 147279 65614 1
<!DOCTYPE html>
<style>
.axis .domain {
display: none;
}
</style>
<script src="https://d3js.org/d3.v4.min.js"></script>
<body>
<button onclick="render('WestCoast')">West Coast</button>
<button onclick="render(1)">The Rest</button><br>
<svg width="700" height="400"></svg>
<script>
function render(region) {
var svg = d3.selectAll("svg"),
margin = { top: 20, right: 20, bottom: 30, left: 40 },
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom,
g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var removeAxis = d3.selectAll("g.axis").remove()
var removeBars = d3.selectAll("rect.bars").remove()
var removeMoreBard = d3.selectAll("g.bars").remove()
var removeLegend = d3.selectAll("g.legend").remove()
var x = d3.scaleBand()
.rangeRound([0, width])
.paddingInner(0.05)
.align(0.1);
var y = d3.scaleLinear()
.rangeRound([height, 0]);
var z = d3.scaleOrdinal()
.range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);
d3.csv("data.csv", function (d, i, columns) {
for (i = 3, t = 0; i < 6; ++i) t += d[columns[i]] = +d[columns[i]];
d.total = t;
return d;
}, function (error, data) {
if (error) throw error;
var keys = data.columns.slice(3, 6);
data = data.filter(function (d) { return d.Region == region })
data.sort(function (a, b) { return b.total - a.total; });
x.domain(data.map(function (d) { return d.State; }));
y.domain([0, d3.max(data, function (d) { return d.total; })]).nice();
z.domain(keys);
var bars = g.append("g")
.selectAll("g").exit().remove()
.data(d3.stack().keys(keys)(data))
.enter().append("g")
.attr("class","bars")
.attr("fill", function (d) { return z(d.key); })
.selectAll("rect")
.data(function (d) { return d; })
var newBars = bars.enter()
.append("rect")
.attr("height", 0)
.attr("width", 0)
.attr("class","bars")
newBars.merge(bars)
.transition()
.attr("x", function (d) { return x(d.data.State); })
.attr("y", function (d) { return y(d[1]); })
.attr("height", function (d) { return y(d[0]) - y(d[1]); })
.attr("width", x.bandwidth())
.attr("class","bars");
var x_axis =
g.append("g")
.attr("class", "axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
var y_axis = g.append("g")
.attr("class", "axis")
.call(d3.axisLeft(y).ticks(null, "s"))
.append("text")
.attr("x", 2)
.attr("y", y(y.ticks().pop()) + 0.5)
.attr("dy", "0.32em")
.attr("fill", "#000")
.attr("font-weight", "bold")
.attr("text-anchor", "start")
.text("Potential");
var legend = g.append("g")
.attr("class", "legend")
.attr("font-family", "sans-serif")
.attr("font-size", 10)
.attr("text-anchor", "end")
.selectAll("g")
.data(keys.slice().reverse())
.enter().append("g")
.attr("transform", function (d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", width - 19)
.attr("width", 19)
.attr("height", 19)
.attr("fill", z);
legend.append("text")
.attr("x", width - 24)
.attr("y", 9.5)
.attr("dy", "0.32em")
.text(function (d) { return d; });
});
}
render('WestCoast')
</script>
</body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment