| <!DOCTYPE html> | |
| <html class="ocks-org"> | |
| <meta charset="utf-8"> | |
| <title>Sankey Diagram</title> | |
| <base href="http://bost.ocks.org/mike/sankey/" target="_blank"> | |
| <style> | |
| @import url(../style.css?aea6f0a); | |
| #chart { | |
| height: 900px; | |
| } | |
| .node rect { | |
| cursor: move; | |
| fill-opacity: .9; | |
| shape-rendering: crispEdges; | |
| } | |
| .node text { | |
| pointer-events: none; | |
| text-shadow: 0 1px 0 #fff; | |
| } | |
| .link { | |
| fill: none; | |
| stroke: #000; | |
| stroke-opacity: .2; | |
| } | |
| .link:hover { | |
| stroke-opacity: .5; | |
| } | |
| </style> | |
| <body> | |
| <h1>Sankey Diagrams</h1> | |
| <p id="chart"> | |
| <aside>Drag to rearrange nodes.</aside> | |
| <!-- <p class="attribution">Source: <a href="http://www.decc.gov.uk/en/content/cms/tackling/2050/calculator_on/calculator_on.aspx">Department of Energy & Climate Change</a>, <a href="http://tamc.github.com/Sankey/">Tom Counsell</a>. --> | |
| <aside>Sankey diagrams are closely related to <a href="http://en.wikipedia.org/wiki/Alluvial_diagram">alluvial diagrams</a>, which show how network structure changes over time.</aside> | |
| <p>Thanks to Mike Bostock, whose <a href="http://bost.ocks.org/mike/sankey/">D3 Sankey plugin</a> was used to help build this visualisation.</p> | |
| <footer> | |
| <aside>November 25, 2013</aside> | |
| <a rel="author">Dan Wood</a> | |
| </footer> | |
| <script src="http://d3js.org/d3.v2.min.js?2.9.1"></script> | |
| <script src="sankey.js"></script> | |
| <script> | |
| var margin = {top: 1, right: 1, bottom: 6, left: 1}, | |
| width = 960 - margin.left - margin.right, | |
| height = 900 - margin.top - margin.bottom; | |
| var formatNumber = d3.format(",.3r"), | |
| format = function(d) { return formatNumber(d) + " TWh"; }, | |
| color = d3.scale.category20(); | |
| var svg = d3.select("#chart").append("svg") | |
| .attr("width", width + margin.left + margin.right) | |
| .attr("height", height + margin.top + margin.bottom) | |
| .append("g") | |
| .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
| var sankey = d3.sankey() | |
| .nodeWidth(15) | |
| .nodePadding(20) | |
| .size([width, height]); | |
| var path = sankey.link(); | |
| d3.json("https://gist.github.com/DanielJWood/7751118/raw/fa750bcc148c705303b84e4eb831acbebfee403a/sankey.json", 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) | |
| //Define with of stroke of link based whatever is larger, d.dy or 1 | |
| .style("stroke-width", function(d) { return Math.max(1, d.dy); }) | |
| .sort(function(a, b) { return b.dy - a.dy; }); | |
| link.append("p") | |
| .text(function(d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); }) | |
| .attr("x", -6) | |
| .attr("y", function(d) { return d.dy / 2; }) | |
| .attr("dy", ".35em"); | |
| 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> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment