A state grid inspired by an Allison McCann graphic on state taxes. (See also David Mimno’s implementation.)
Mainly, this was an excuse to embed data as ASCII art.
license: gpl-3.0 |
A state grid inspired by an Allison McCann graphic on state taxes. (See also David Mimno’s implementation.)
Mainly, this was an excuse to embed data as ASCII art.
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
.state rect { | |
fill: #dedede; | |
} | |
.state text { | |
font: 12px sans-serif; | |
text-anchor: middle; | |
} | |
.state--selected rect { | |
fill: #9f4a6c; | |
} | |
.state--selected text { | |
fill: white; | |
} | |
</style> | |
<svg width="960" height="500"></svg> | |
<script id="grid" type="text/plain"> | |
ME | |
WI VT NH | |
WA ID MT ND MN IL MI NY MA | |
OR NV WY SD IA IN OH PA NJ CT RI | |
CA UT CO NE MO KY WV VA MD DE | |
AZ NM KS AR TN NC SC | |
OK LA MS AL GA | |
HI AK TX FL | |
</script> | |
<script src="//d3js.org/d3.v3.min.js"></script> | |
<script> | |
var states = [], | |
selectedStates = ["MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT"]; | |
d3.select("#grid").text().split("\n").forEach(function(line, i) { | |
var re = /\w+/g, m; | |
while (m = re.exec(line)) states.push({ | |
name: m[0], | |
selected: selectedStates.indexOf(m[0]) >= 0, | |
x: m.index / 3, | |
y: i | |
}); | |
}); | |
var svg = d3.select("svg"), | |
width = +svg.attr("width"), | |
height = +svg.attr("height"); | |
var gridWidth = d3.max(states, function(d) { return d.x; }) + 1, | |
gridHeight = d3.max(states, function(d) { return d.y; }) + 1, | |
cellSize = 40; | |
var state = svg.append("g") | |
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")") | |
.selectAll(".state") | |
.data(states) | |
.enter().append("g") | |
.attr("class", function(d) { return "state" + (d.selected ? " state--selected" : ""); }) | |
.attr("transform", function(d) { return "translate(" + (d.x - gridWidth / 2) * cellSize + "," + (d.y - gridHeight / 2) * cellSize + ")"; }); | |
state.append("rect") | |
.attr("x", -cellSize / 2) | |
.attr("y", -cellSize / 2) | |
.attr("width", cellSize - 1) | |
.attr("height", cellSize - 1); | |
state.append("text") | |
.attr("dy", ".35em") | |
.text(function(d) { return d.name; }); | |
</script> |