Sankey Diagram

Credits to Mike Bostock (bost.ocks.org/mike/sankey/)

<script src="/wp-content/uploads/2014/04/sankey2.js"></script>
[d3-source canvas="chart"]
  var width = 620, height = 500;
  var formatNumber = d3.format(",.0f");
  var format = function(d) { return formatNumber(d) + " TWh"; };
  var color = d3.scale.category20();
  var svg = d3.select(".chart").append("svg").attr("width", width).attr("height", height).append("g");
  var sankey = d3.sankey().nodeWidth(15).nodePadding(10).size([width, height]);
  var path = sankey.link();
  d3.json("/wp-content/uploads/2014/04/energy.js", function(energy) {
    sankey.nodes(energy.nodes).links(energy.links).layout(32);
    var link = svg.append("g").selectAll(".link")
                  .data(energy.links)
                  .enter().append("path")
                  .attr("class", "link")
                  .attr("d", path)
                  .style("stroke-width", function(d) { return Math.max(1, d.dy); })
                  .sort(function(a, b) { return b.dy - a.dy; });

    link.append("title")
        .text(function(d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); });

    var node = svg.append("g").selectAll(".node")
        .data(energy.nodes)
        .enter().append("g")
        .attr("class", "node")
        .attr("transform", function(d) { return "translate("+d.x+","+d.y+")"; })
        .call(d3.behavior.drag().origin(function(d) { return d; })
             .on("dragstart", function() { this.parentNode.appendChild(this); })
             .on("drag", dragmove)
         );

  node.append("rect")
      .attr("height", function(d) { return d.dy; })
      .attr("width", sankey.nodeWidth())
      .style("fill", function(d) { return d.color = color(d.name.replace(/ .*/, "")); })
      .style("stroke", function(d) { return d3.rgb(d.color).darker(2); })
      .append("title")
      .text(function(d) { return d.name + "\n" + format(d.value); });

  node.append("text").attr("x", -6).attr("y", function(d) { return d.dy / 2; }).attr("dy", ".35em")
      .attr("text-anchor", "end")
      .attr("transform", null)
      .text(function(d) { return d.name; })
      .filter(function(d) { return d.x < width / 2; })
      .attr("x", 6 + sankey.nodeWidth())
      .attr("text-anchor", "start");

  function dragmove(d) {
    d3.select(this).attr("transform", "translate(" + d.x + "," + (d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))) + ")");
    sankey.relayout();
    link.attr("d", path);
  }
});
</script>
[/d3-source]


[d3-source canvas="chart"]

var width = 960, height = 500;

var formatNumber = d3.format(",.0f"),
format = function(d) { return formatNumber(d) + " TWh"; },
color = d3.scale.category20();

var svg = d3.select(".chart").append("svg").attr("width", width).attr("height", height).append("g");

var sankey = d3.sankey().nodeWidth(15).nodePadding(10).size([width, height]);

var path = sankey.link();

d3.json("/wp-content/uploads/2014/04/energy.js", function(energy) {

sankey.nodes(energy.nodes).links(energy.links).layout(32);

var link = svg.append("g").selectAll(".link")
.data(energy.links)
.enter().append("path")
.attr("class", "link")
.attr("d", path)
.style("stroke-width", function(d) { return Math.max(1, d.dy); })
.sort(function(a, b) { return b.dy - a.dy; });

link.append("title")
.text(function(d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); });

var node = svg.append("g").selectAll(".node")
.data(energy.nodes)
.enter().append("g")
.attr("class", "node")
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
.call(d3.behavior.drag()
.origin(function(d) { return d; })
.on("dragstart", function() { this.parentNode.appendChild(this); })
.on("drag", dragmove));

node.append("rect")
.attr("height", function(d) { return d.dy; })
.attr("width", sankey.nodeWidth())
.style("fill", function(d) { return d.color = color(d.name.replace(/ .*/, "")); })
.style("stroke", function(d) { return d3.rgb(d.color).darker(2); })
.append("title")
.text(function(d) { return d.name + "\n" + format(d.value); });

node.append("text")
.attr("x", -6)
.attr("y", function(d) { return d.dy / 2; })
.attr("dy", ".35em")
.attr("text-anchor", "end")
.attr("transform", null)
.text(function(d) { return d.name; })
.filter(function(d) { return d.x < width / 2; }) .attr("x", 6 + sankey.nodeWidth()) .attr("text-anchor", "start"); function dragmove(d) { d3.select(this).attr("transform", "translate(" + d.x + "," + (d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))) + ")"); sankey.relayout(); link.attr("d", path); } });
[/d3-source]