Skip to content

Instantly share code, notes, and snippets.

@ajmistu
Last active July 16, 2017 19:58
Show Gist options
  • Select an option

  • Save ajmistu/040e35fd314cc57a7336689041e5097a to your computer and use it in GitHub Desktop.

Select an option

Save ajmistu/040e35fd314cc57a7336689041e5097a to your computer and use it in GitHub Desktop.
fresh block
license: mit
<!DOCTYPE html>
<meta charset="utf-8">
<style>
canvas, svg {
position: absolute;
top: 0
left: 0;
}
svg {
z-index: 10;
}
.axis-grid line {
stroke: #ffffff;
stroke-width: 2;
}
</style>
<body>
<svg width="900" height="600"></svg>
<script src="//d3js.org/d3.v4.js"></script>
<script>
d3.csv("sankey.csv", function(rows) {
console.log(rows);
var parents = [];
rows.forEach(function(row) {
// if we don't have this parent yet, add a blank node
if (parents[row.target] === undefined) {
parents[row.target] = {level: row.target, children: []};
}
parents[row.target].children.push({value: row.source});
});
for (var i = parents.length - 1; i > 1; i--) {
parents[i].children.push(parents[i-1]);
}
// var root = parents[parents.length - 1];
// console.log(parents[parents.length - 1]);
// console.log(JSON.stringify(parents[parents.length-1]));
// remove undefined items
parents = parents.filter(function(d) { return true; });
var svg = d3.select('svg').append('g')
.attr('transform', 'translate(20,20)');
var width = 600;
var categoryBands = d3.scaleBand()
.range([0, width - -130])
.domain(parents.map(function(d) { return d.level; }));
var headers = svg.append('g')
.attr('class', 'headers');
var level = headers.selectAll("g.level")
.data(parents)
.enter().append('g')
.attr('class', 'level')
.attr('transform',
function(d,i) { return 'translate(' + categoryBands(d.level) + ',0)'; });
level.append('text')
// .attr('x', categoryBands.bandwidth() / 2)
.attr('text-anchor', 'middle')
.text(function(d) { return d.level; });
var items = level.selectAll('g.item').data(function(d) { return d.children; })
.enter().append('g')
.attr('class', 'item')
.attr('transform', function(d, i) { return 'translate(0, ' + ((i+1) * 20) + ')'; })
items.append('text')
.text(function(d) { return d.value; });
});
// bar.attr('width', function(d) { return x(d); });
</script>
source target value
omelet 1 2
tostada 1 2
burrito 1 2
hummus 2 2
fondue 3 2
sugar 4 2
lemonade 5 2
screwdriver 6 2
champagne 6 2
martini 7 2
egg yolk 8 2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment