(function() { 'use strict'; var data = [ { name: 'S', born: 1977, colour: '#FDBB30' }, { name: 'H', born: 1978, colour: '#7AC143' }, { name: 'M', born: 2001, colour: '#EC008C' }, { name: 'A', born: 2004, colour: '#00B0DD' }, { name: 'K', born: 2007, colour: '#EE3124' }, { name: 'Z', born: 2014, colour: '#F47521' }, ]; var dates = [1988, 1998, 2001, 2004, 2007, 2015, 2018, 2021, 2023, 2026, 2029, 2050]; var w = 900, h = 300; // // svg container var svg = d3.select('#vis').append('svg') .attr({ width: w, height: h }); var scale = d3.scale.linear() .domain([0, 100]) .range([40, w - 40]); console.log(scale(28)); // reference for date selection var selectedDate = 2015; // create navigation function buttons() { var nav = d3.select('nav').append('ul'); var li = nav.selectAll('li') .data(dates) .enter() .append('li'); li .text(function (d) { return d; }) .style('pointer-event', 'none'); li .on('click', function (d) { selectedDate = d; render(); }); } // create chart function bar() { // group var g = svg.selectAll('g') .data(data) .enter() .append('g') .classed('gBar', true); // name g.append('text') .attr({ class: 'name', x: 20, y: function (d,i) { return ySpacing(i); }, }) .text(function (d) { return d.name; }); // bar g.append('rect') .attr({ x: 40, y: function (d,i) { return ySpacing(i) -5; }, width: 0, height: 8 }) .style({ stroke: 'none', fill: function (d) { return d.colour; } }) .transition() // a little motion .attr({ width: function (d) { if (age(d.born, selectedDate) < 0) { return 0; } else { return scale(age(d.born, selectedDate)); } } }); // age g.append('text') .attr({ class: 'age', x: function (d) { if (age(d.born, selectedDate) < 0) { return 40; } else { return scale(age(d.born, selectedDate)) + 60; } }, y: function (d,i) { return ySpacing(i); }, }) .text(function (d) { if (age(d.born, selectedDate) < 0) { return 'not born'; } else { return age(d.born, selectedDate); } }); } // calculate age function age(_birth, _date) { // use moment.js to calc age var a = moment([_birth, 0]); var b = moment([_date, 0]); return b.diff(a, 'years'); } // calculate spacing (so I can change in one place) function ySpacing(_i) { return _i*40 + 40; } // update on selection function render() { d3.selectAll('.gBar').remove(); bar(); } // render navigation options buttons(); // render initial chart render(); })();