On Github mspencer53 / d3training
Or How We Learned to Stop Worrying and Love the Gantt
d3.select('body')
.append('p')
.text('New paragraph!');
var body = d3.select('body');
var p = body.append('p');
p.text('New paragraph!');
First things first:
Chaining & select and append.
d3.select('p')
.text('Danger Zone');
d3.select('#divId')
.style('width', '200px');
d3.selectAll('p')
.text('Danger Zone');
d3.select('body')
.append('p')
.text('This is just... babytown frolics');
d3.select('#divId')
.append('p')
.text('This is like taking candy from... a candy hating baby');
HTML
D3
var canvas = d3.select('body')
.append('svg')
.attr('width', 500)
.attr('height', 200);
var rect = canvas.append('rect')
.attr('x', 10)
.attr('y', 10)
.attr('width', 100)
.attr('height', 100);
var canvas = d3.select('body')
.append('svg')
.attr('width', 500)
.attr('height', 200);
var data = [ 250, 300, 50, 150, 100 ];
var bars = canvas.selectAll('rect')
.data(data)
.enter()
.selectAll() + .data() + .enter() = ENTER SET
Everything after this is in "for each mode"
.append('rect')
.attr('height', 30)
.attr('width', function(d){
return d;
})
.attr('y', function(d,i){
return i * 35;
});
DOM elements < data elements
canvas.selectAll('rect')
.data(data)
.enter()
Pop Quiz: How many elements will be in the Enter Set?
var canvas = d3.select('body')
.append('svg')
.attr('width', 500)
.attr('height', 200);
var rect = canvas.append('rect')
.attr('width', 100)
.attr('height', 100);
var data = [ 250, 300, 50, 150, 100 ];
var bars = canvas.selectAll('rect')
.data(data)
.enter()
DOM elements > data elements
canvas.selectAll('rect')
.data(data)
.exit()
DOM elements = data elements
canvas.selectAll('rect')
.data(data)
If elements in our update set are changing width, we must tell them to recalculate.
canvas.selectAll('rect')
.data(data)
.attr('width', function(d){
return d;
});
To remove elements in the exit set use .remove()
canvas.selectAll('rect')
.data(data)
.exit()
.remove();
.transition()What to transition to:
.attr('fill', 'blue')
.attr('width', function(d){
return d.width;
})
.attr('x', function(d){
return d.x;
}))
A state from which to transition:
.attr('fill', 'green')
.transition()
.duration(2000)
.delay(1000)
.ease('linear')
Hey this is unrealistic data! o_O
data = [200, 100, 400, 300];But its conveinent for drawing :)
Slightly More Realistic Data! ヽ(•‿•)ノ
data = [2.855, 0.576412, 5.188, 6.553];But sucks for for drawing :(
Lets solve this with a scale function!
var widthScale = d3.scale.linear()
.domain([0, 6.553]) // Min to max of data
.range([0, 500]); // Min to max of DOM elements
...and call it when we calculate width! Brilliant!
.attr('width', function(d) { return widthScale(d); })
That was good, but this is better:
var widthScale = d3.scale.linear()
.domain([0, d3.max(data)]) // There's also d3.min(data)
.range([0, 500])
.nice(); // Gives us some padding
.attr('transform', 'translate(10, 50)') //Move 10x and 50y
.attr('transform', 'scale(1.5)') //Make things 1.5x bigger
.attr('transform', 'rotate(90)') //Rotate 90 deg
Or put them all together
.attr('transform', 'translate(10, 50)scale(1.5)rotate(90)')
var axis = d3.svg.axis()
.scale(widthScale);
canvas.call(axis);
var axis = d3.svg.axis()
.ticks(5) //Default is 10
.scale(widthScale);
canvas.append('g')
.attr('transform', 'translate(0,175)')
.call(axis);
Now that you're awake we can continue...
What kind of changes appear to happen in this chart?
How about this one?
var data = [
{id:1, value:15},
{id:2, value:20},
{id:3, value:35}
];
function key(d) {
return d.id; //can be anything as long as its unique.
}
canvas.selectAll('rect')
.data(data, key)
Or we can do it all inline:
canvas.selectAll('rect')
.data(data, function(d){ return d.id; })
I love D3!!!!!!