data viz with d3
Matthew Zhang
What is d3?
A popular framework for creating data visualizations, such as...
"Data-Driven Documents"
Why d3?
Lightweight (127 KB)
Highly flexible/customizable
A good data visualization should...
Be clear
Be honest
Be visually appealing
Tell a story
First Pass (datawrapper)


Second Pass (d3)
How does it all work?
Data Binding
DOM
(Document Object Model)
DATA
d3 binds data to the Document Object Model
(Basically, it gives your data direct access to HTML, CSS, SVG, etc)

var cards = svg.selectAll(".hour")
.data(data).enter().append("rect")
.attr("x", function(d) { return (d.hour - 1) * gridSize + 90; })
.attr("y", function(d) { return (d.day - 1) * gridSize; })
.attr("width", gridSize)
.attr("height", gridSize)
.style("fill", function(d) { return colorScale(d.value) }
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
var data = [{"hour":1,"day":7,"value":null},{"hour":2,"day":7,"value":null},{"hour":3,"day":7,"value":0},{"hour":4,"day":7,"value":0},{"hour":5,"day":7,"value":1},{"hour":6,"day":7,"value":25}, {"hour":7,"day":7,"value":32},{"hour":8,"day":7,"value":29},
{"hour":9,"day":7,"value":23},{"hour":10,"day":7,"value":22},{"hour":11,"day":7,"value":28},{"hour":12,"day":7,"value":23},{"hour":13,"day":7,"value":22},{"hour":14,"day":7,"value":15},
var cards = svg.selectAll(".hour")
.data(data).enter().append("rect")
.attr("x", function(d) { return (d.hour - 1) * gridSize + 90; })
.attr("y", function(d) { return (d.day - 1) * gridSize; })
.attr("width", gridSize)
.attr("height", gridSize)
.style("fill", function(d) { return colorScale(d.value) }
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
var data = [{"hour":1,"day":7,"value":null},{"hour":2,"day":7,"value":null},{"hour":3,"day":7,"value":0},{"hour":4,"day":7,"value":0},{"hour":5,"day":7,"value":1},{"hour":6,"day":7,"value":25}, {"hour":7,"day":7,"value":32},{"hour":8,"day":7,"value":29},
{"hour":9,"day":7,"value":23},{"hour":10,"day":7,"value":22},{"hour":11,"day":7,"value":28},{"hour":12,"day":7,"value":23},{"hour":13,"day":7,"value":22},{"hour":14,"day":7,"value":15},
var cards = svg.selectAll(".hour")
.data(data).enter().append("rect")
.attr("x", function(d) { return (d.hour - 1) * gridSize + 90; })
.attr("y", function(d) { return (d.day - 1) * gridSize; })
.attr("width", gridSize)
.attr("height", gridSize)
.style("fill", function(d) { return colorScale(d.value) }
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
var data = [{"hour":1,"day":7,"value":null},{"hour":2,"day":7,"value":null},{"hour":3,"day":7,"value":0},{"hour":4,"day":7,"value":0},{"hour":5,"day":7,"value":1},{"hour":6,"day":7,"value":25}, {"hour":7,"day":7,"value":32},{"hour":8,"day":7,"value":29},
{"hour":9,"day":7,"value":23},{"hour":10,"day":7,"value":22},{"hour":11,"day":7,"value":28},{"hour":12,"day":7,"value":23},{"hour":13,"day":7,"value":22},{"hour":14,"day":7,"value":15},
var cards = svg.selectAll(".hour")
.data(data).enter().append("rect")
.attr("x", function(d) { return (d.hour - 1) * gridSize + 90; })
.attr("y", function(d) { return (d.day - 1) * gridSize; })
.attr("width", gridSize)
.attr("height", gridSize)
.style("fill", function(d) { return colorScale(d.value) }
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
var data = [{"hour":1,"day":7,"value":null},{"hour":2,"day":7,"value":null},{"hour":3,"day":7,"value":0},{"hour":4,"day":7,"value":0},{"hour":5,"day":7,"value":1},{"hour":6,"day":7,"value":25}, {"hour":7,"day":7,"value":32},{"hour":8,"day":7,"value":29},
{"hour":9,"day":7,"value":23},{"hour":10,"day":7,"value":22},{"hour":11,"day":7,"value":28},{"hour":12,"day":7,"value":23},{"hour":13,"day":7,"value":22},{"hour":14,"day":7,"value":15},
Other Neat d3 Features
Transitions
Layouts
Selections

Limitations
Steep learning curve for simple graphs
Underlying data visible
Not supported in IE
DOM rendering can be slow
¯\_(ツ)_/¯
Learning Resources
tldr;
d3 is super cool
Copy of d3 stuff
By knightlab
Copy of d3 stuff
- 273
