d3.csv('titanic_dataset.csv', function(data) { alluvial.draw( d3.select('svg'), dataToGraph(data) ); }) var dataToGraph = function(data) { var d = { nodes: [], links: [] } var steps = _.keys(_.first(data)); if ( steps < 2) return d; var n = [], l = [], si, ti; for (var i=0; i < steps.length-1; i++ ) { var sg = steps[i] var tg = steps[i+1] var relations = d3.nest() .key(function (d) { return d[sg] } ) .key(function (d) { return d[tg] } ) .entries(data) relations.forEach(function (s){ si = getNodeIndex(n, s.key, sg); if ( si == -1) { n.push({ name : s.key, group : sg }) si = n.length-1; } s.values.forEach(function (t){ ti = getNodeIndex(n, t.key, tg) if (ti == -1) { n.push({ name : t.key, group : tg }) ti = n.length-1; } var value = t.values.length; var link = { source : n[si], target : n[ti], value : value }; l.push(link); }) }) } d.nodes = n.sort(customSort); l.forEach(function (d){ d.source = n.indexOf(d.source); d.target = n.indexOf(d.target)}); d.links = l; return d; } function customSort(a, b) { var Item1 = a.group; var Item2 = b.group; if(Item1 != Item2) return (Item1.localeCompare(Item2)); else return (a.name.localeCompare(b.name)); } function getNodeIndex(array, name, group) { for (var i in array) { var a = array[i] if (a['name'] == name && a['group'] == group) { return i; } } return -1; }