From ac8e7df252a738063a6d65d1fcf12b5e333191ca Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 23 Oct 2018 14:14:22 -0400 Subject: [PATCH 1/3] ensures that padded space is not larger than figure --- src/sankey.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sankey.js b/src/sankey.js index c5db686..868d128 100644 --- a/src/sankey.js +++ b/src/sankey.js @@ -1,4 +1,4 @@ -import {ascending, min, sum} from "d3-array"; +import {ascending, min, sum, max} from "d3-array"; import {nest} from "d3-collection"; import {interpolateNumber} from "d3-interpolate"; @@ -184,6 +184,11 @@ export default function() { } function initializeNodeDepth() { + var L = max(nodesByBreadth, function(nodes) { + return nodes.length; + }); + var maxNodePadding = 2/3 * size[1] / (L - 1); + if(nodePadding > maxNodePadding) nodePadding = maxNodePadding; var ky = min(nodesByBreadth, function(nodes) { return (size[1] - (nodes.length - 1) * nodePadding) / sum(nodes, value); }); From 6f19390be0da4a81abf6f7f6cfdf5fc8dc73e583 Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 23 Oct 2018 16:09:14 -0400 Subject: [PATCH 2/3] add built files --- build/d3-sankey.js | 320 +++++++++++++++++++++++++++++++++++++++++ build/d3-sankey.min.js | 2 + 2 files changed, 322 insertions(+) create mode 100644 build/d3-sankey.js create mode 100644 build/d3-sankey.min.js diff --git a/build/d3-sankey.js b/build/d3-sankey.js new file mode 100644 index 0000000..19b4e45 --- /dev/null +++ b/build/d3-sankey.js @@ -0,0 +1,320 @@ +// https://github.com/d3/d3-sankey Version 0.5.0. Copyright 2018 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-collection'), require('d3-interpolate')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-collection', 'd3-interpolate'], factory) : + (factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3)); +}(this, (function (exports,d3Array,d3Collection,d3Interpolate) { 'use strict'; + +var sankey = function() { + var sankey = {}, + nodeWidth = 24, + nodePadding = 8, + size = [1, 1], + nodes = [], + links = []; + + sankey.nodeWidth = function(_) { + if (!arguments.length) return nodeWidth; + nodeWidth = +_; + return sankey; + }; + + sankey.nodePadding = function(_) { + if (!arguments.length) return nodePadding; + nodePadding = +_; + return sankey; + }; + + sankey.nodes = function(_) { + if (!arguments.length) return nodes; + nodes = _; + return sankey; + }; + + sankey.links = function(_) { + if (!arguments.length) return links; + links = _; + return sankey; + }; + + sankey.size = function(_) { + if (!arguments.length) return size; + size = _; + return sankey; + }; + + sankey.layout = function(iterations) { + computeNodeLinks(); + computeNodeValues(); + computeNodeBreadths(); + computeNodeDepths(iterations); + computeLinkDepths(); + return sankey; + }; + + sankey.relayout = function() { + computeLinkDepths(); + return sankey; + }; + + sankey.link = function() { + var curvature = .5; + + function link(d) { + var x0 = d.source.x + d.source.dx, + x1 = d.target.x, + xi = d3Interpolate.interpolateNumber(x0, x1), + x2 = xi(curvature), + x3 = xi(1 - curvature), + y0a = d.source.y + d.sy, + y0b = y0a + d.dy, + y1a = d.target.y + d.ty, + y1b = y1a + d.dy; + return "M" + x0 + "," + y0a + + "C" + x2 + "," + y0a + + " " + x3 + "," + y1a + + " " + x1 + "," + y1a + + "L" + x1 + "," + y1b + + "C" + x3 + "," + y1b + + " " + x2 + "," + y0b + + " " + x0 + "," + y0b + + "Z"; + } + + link.curvature = function(_) { + if (!arguments.length) return curvature; + curvature = +_; + return link; + }; + + return link; + }; + + // Populate the sourceLinks and targetLinks for each node. + // Also, if the source and target are not objects, assume they are indices. + function computeNodeLinks() { + nodes.forEach(function(node) { + node.sourceLinks = []; + node.targetLinks = []; + }); + links.forEach(function(link, i) { + var source = link.source, + target = link.target; + if (typeof source === "number") source = link.source = nodes[link.source]; + if (typeof target === "number") target = link.target = nodes[link.target]; + link.originalIndex = i; + source.sourceLinks.push(link); + target.targetLinks.push(link); + }); + } + + // Compute the value (size) of each node by summing the associated links. + function computeNodeValues() { + nodes.forEach(function(node) { + node.value = Math.max( + d3Array.sum(node.sourceLinks, value), + d3Array.sum(node.targetLinks, value) + ); + }); + } + + // Iteratively assign the breadth (x-position) for each node. + // Nodes are assigned the maximum breadth of incoming neighbors plus one; + // nodes with no incoming links are assigned breadth zero, while + // nodes with no outgoing links are assigned the maximum breadth. + function computeNodeBreadths() { + var remainingNodes = nodes, + nextNodes, + x = 0; + + while (remainingNodes.length) { + nextNodes = []; + remainingNodes.forEach(function(node) { + node.x = x; + node.dx = nodeWidth; + node.sourceLinks.forEach(function(link) { + if (nextNodes.indexOf(link.target) < 0) { + nextNodes.push(link.target); + } + }); + }); + remainingNodes = nextNodes; + ++x; + } + + // + moveSinksRight(x); + scaleNodeBreadths((size[0] - nodeWidth) / (x - 1)); + } + + // function moveSourcesRight() { + // nodes.forEach(function(node) { + // if (!node.targetLinks.length) { + // node.x = min(node.sourceLinks, function(d) { return d.target.x; }) - 1; + // } + // }); + // } + + function moveSinksRight(x) { + nodes.forEach(function(node) { + if (!node.sourceLinks.length) { + node.x = x - 1; + } + }); + } + + function scaleNodeBreadths(kx) { + nodes.forEach(function(node) { + node.x *= kx; + }); + } + + function computeNodeDepths(iterations) { + var nodesByBreadth = d3Collection.nest() + .key(function(d) { return d.x; }) + .sortKeys(d3Array.ascending) + .entries(nodes) + .map(function(d) { return d.values; }); + + // + initializeNodeDepth(); + resolveCollisions(); + for (var alpha = 1; iterations > 0; --iterations) { + relaxRightToLeft(alpha *= .99); + resolveCollisions(); + relaxLeftToRight(alpha); + resolveCollisions(); + } + + function initializeNodeDepth() { + var L = d3Array.max(nodesByBreadth, function(nodes) { + return nodes.length; + }); + var maxNodePadding = 2/3 * size[1] / (L - 1); + if(nodePadding > maxNodePadding) nodePadding = maxNodePadding; + var ky = d3Array.min(nodesByBreadth, function(nodes) { + return (size[1] - (nodes.length - 1) * nodePadding) / d3Array.sum(nodes, value); + }); + + nodesByBreadth.forEach(function(nodes) { + nodes.forEach(function(node, i) { + node.y = i; + node.dy = node.value * ky; + }); + }); + + links.forEach(function(link) { + link.dy = link.value * ky; + }); + } + + function relaxLeftToRight(alpha) { + nodesByBreadth.forEach(function(nodes) { + nodes.forEach(function(node) { + if (node.targetLinks.length) { + var y = d3Array.sum(node.targetLinks, weightedSource) / d3Array.sum(node.targetLinks, value); + node.y += (y - center(node)) * alpha; + } + }); + }); + + function weightedSource(link) { + return center(link.source) * link.value; + } + } + + function relaxRightToLeft(alpha) { + nodesByBreadth.slice().reverse().forEach(function(nodes) { + nodes.forEach(function(node) { + if (node.sourceLinks.length) { + var y = d3Array.sum(node.sourceLinks, weightedTarget) / d3Array.sum(node.sourceLinks, value); + node.y += (y - center(node)) * alpha; + } + }); + }); + + function weightedTarget(link) { + return center(link.target) * link.value; + } + } + + function resolveCollisions() { + nodesByBreadth.forEach(function(nodes) { + var node, + dy, + y0 = 0, + n = nodes.length, + i; + + // Push any overlapping nodes down. + nodes.sort(ascendingDepth); + for (i = 0; i < n; ++i) { + node = nodes[i]; + dy = y0 - node.y; + if (dy > 0) node.y += dy; + y0 = node.y + node.dy + nodePadding; + } + + // If the bottommost node goes outside the bounds, push it back up. + dy = y0 - nodePadding - size[1]; + if (dy > 0) { + y0 = node.y -= dy; + + // Push any overlapping nodes back up. + for (i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.y + node.dy + nodePadding - y0; + if (dy > 0) node.y -= dy; + y0 = node.y; + } + } + }); + } + + function ascendingDepth(a, b) { + return a.y - b.y; + } + } + + function computeLinkDepths() { + nodes.forEach(function(node) { + node.sourceLinks.sort(ascendingTargetDepth); + node.targetLinks.sort(ascendingSourceDepth); + }); + nodes.forEach(function(node) { + var sy = 0, ty = 0; + node.sourceLinks.forEach(function(link) { + link.sy = sy; + sy += link.dy; + }); + node.targetLinks.forEach(function(link) { + link.ty = ty; + ty += link.dy; + }); + }); + + function ascendingSourceDepth(a, b) { + return (a.source.y - b.source.y) || (a.originalIndex - b.originalIndex); + } + + function ascendingTargetDepth(a, b) { + return (a.target.y - b.target.y) || (a.originalIndex - b.originalIndex); + } + } + + function center(node) { + return node.y + node.dy / 2; + } + + function value(link) { + return link.value; + } + + return sankey; +}; + +exports.sankey = sankey; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/build/d3-sankey.min.js b/build/d3-sankey.min.js new file mode 100644 index 0000000..489a946 --- /dev/null +++ b/build/d3-sankey.min.js @@ -0,0 +1,2 @@ +// https://github.com/d3/d3-sankey Version 0.5.0. Copyright 2018 Mike Bostock. +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-array"),require("d3-collection"),require("d3-interpolate")):"function"==typeof define&&define.amd?define(["exports","d3-array","d3-collection","d3-interpolate"],t):t(n.d3=n.d3||{},n.d3,n.d3,n.d3)}(this,function(n,t,r,e){"use strict";var o=function(){function n(){v.forEach(function(n){n.sourceLinks=[],n.targetLinks=[]}),k.forEach(function(n,t){var r=n.source,e=n.target;"number"==typeof r&&(r=n.source=v[n.source]),"number"==typeof e&&(e=n.target=v[n.target]),n.originalIndex=t,r.sourceLinks.push(n),e.targetLinks.push(n)})}function o(){v.forEach(function(n){n.value=Math.max(t.sum(n.sourceLinks,y),t.sum(n.targetLinks,y))})}function u(){for(var n,t=v,r=0;t.length;)n=[],t.forEach(function(t){t.x=r,t.dx=l,t.sourceLinks.forEach(function(t){n.indexOf(t.target)<0&&n.push(t.target)})}),t=n,++r;i(r),c((h[0]-l)/(r-1))}function i(n){v.forEach(function(t){t.sourceLinks.length||(t.x=n-1)})}function c(n){v.forEach(function(t){t.x*=n})}function f(n){function e(){u.forEach(function(n){var t,r,e,u=0,i=n.length;for(n.sort(o),e=0;e0&&(t.y+=r),u=t.y+t.dy+g;if((r=u-g-h[1])>0)for(u=t.y-=r,e=i-2;e>=0;--e)t=n[e],r=t.y+t.dy+g-u,r>0&&(t.y-=r),u=t.y})}function o(n,t){return n.y-t.y}var u=r.nest().key(function(n){return n.x}).sortKeys(t.ascending).entries(v).map(function(n){return n.values});!function(){var n=t.max(u,function(n){return n.length}),r=2/3*h[1]/(n-1);g>r&&(g=r);var e=t.min(u,function(n){return(h[1]-(n.length-1)*g)/t.sum(n,y)});u.forEach(function(n){n.forEach(function(n,t){n.y=t,n.dy=n.value*e})}),k.forEach(function(n){n.dy=n.value*e})}(),e();for(var i=1;n>0;--n)!function(n){function r(n){return s(n.target)*n.value}u.slice().reverse().forEach(function(e){e.forEach(function(e){if(e.sourceLinks.length){var o=t.sum(e.sourceLinks,r)/t.sum(e.sourceLinks,y);e.y+=(o-s(e))*n}})})}(i*=.99),e(),function(n){function r(n){return s(n.source)*n.value}u.forEach(function(e){e.forEach(function(e){if(e.targetLinks.length){var o=t.sum(e.targetLinks,r)/t.sum(e.targetLinks,y);e.y+=(o-s(e))*n}})})}(i),e()}function a(){function n(n,t){return n.source.y-t.source.y||n.originalIndex-t.originalIndex}function t(n,t){return n.target.y-t.target.y||n.originalIndex-t.originalIndex}v.forEach(function(r){r.sourceLinks.sort(t),r.targetLinks.sort(n)}),v.forEach(function(n){var t=0,r=0;n.sourceLinks.forEach(function(n){n.sy=t,t+=n.dy}),n.targetLinks.forEach(function(n){n.ty=r,r+=n.dy})})}function s(n){return n.y+n.dy/2}function y(n){return n.value}var d={},l=24,g=8,h=[1,1],v=[],k=[];return d.nodeWidth=function(n){return arguments.length?(l=+n,d):l},d.nodePadding=function(n){return arguments.length?(g=+n,d):g},d.nodes=function(n){return arguments.length?(v=n,d):v},d.links=function(n){return arguments.length?(k=n,d):k},d.size=function(n){return arguments.length?(h=n,d):h},d.layout=function(t){return n(),o(),u(),f(t),a(),d},d.relayout=function(){return a(),d},d.link=function(){function n(n){var r=n.source.x+n.source.dx,o=n.target.x,u=e.interpolateNumber(r,o),i=u(t),c=u(1-t),f=n.source.y+n.sy,a=f+n.dy,s=n.target.y+n.ty,y=s+n.dy;return"M"+r+","+f+"C"+i+","+f+" "+c+","+s+" "+o+","+s+"L"+o+","+y+"C"+c+","+y+" "+i+","+a+" "+r+","+a+"Z"}var t=.5;return n.curvature=function(r){return arguments.length?(t=+r,n):t},n},d};n.sankey=o,Object.defineProperty(n,"__esModule",{value:!0})}); \ No newline at end of file From 1a79abb316049bc88b16727a27e7b4a5a77fd14e Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Wed, 24 Oct 2018 14:51:39 -0400 Subject: [PATCH 3/3] identify clearly `maxPaddedSpace` at the top of the file --- build/d3-sankey.js | 5 +++-- build/d3-sankey.min.js | 2 +- src/sankey.js | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/build/d3-sankey.js b/build/d3-sankey.js index 19b4e45..2155cfa 100644 --- a/build/d3-sankey.js +++ b/build/d3-sankey.js @@ -11,7 +11,8 @@ var sankey = function() { nodePadding = 8, size = [1, 1], nodes = [], - links = []; + links = [], + maxPaddedSpace = 2 / 3; // Defined as a fraction of the total available space sankey.nodeWidth = function(_) { if (!arguments.length) return nodeWidth; @@ -190,7 +191,7 @@ var sankey = function() { var L = d3Array.max(nodesByBreadth, function(nodes) { return nodes.length; }); - var maxNodePadding = 2/3 * size[1] / (L - 1); + var maxNodePadding = maxPaddedSpace * size[1] / (L - 1); if(nodePadding > maxNodePadding) nodePadding = maxNodePadding; var ky = d3Array.min(nodesByBreadth, function(nodes) { return (size[1] - (nodes.length - 1) * nodePadding) / d3Array.sum(nodes, value); diff --git a/build/d3-sankey.min.js b/build/d3-sankey.min.js index 489a946..9f8aa0f 100644 --- a/build/d3-sankey.min.js +++ b/build/d3-sankey.min.js @@ -1,2 +1,2 @@ // https://github.com/d3/d3-sankey Version 0.5.0. Copyright 2018 Mike Bostock. -!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-array"),require("d3-collection"),require("d3-interpolate")):"function"==typeof define&&define.amd?define(["exports","d3-array","d3-collection","d3-interpolate"],t):t(n.d3=n.d3||{},n.d3,n.d3,n.d3)}(this,function(n,t,r,e){"use strict";var o=function(){function n(){v.forEach(function(n){n.sourceLinks=[],n.targetLinks=[]}),k.forEach(function(n,t){var r=n.source,e=n.target;"number"==typeof r&&(r=n.source=v[n.source]),"number"==typeof e&&(e=n.target=v[n.target]),n.originalIndex=t,r.sourceLinks.push(n),e.targetLinks.push(n)})}function o(){v.forEach(function(n){n.value=Math.max(t.sum(n.sourceLinks,y),t.sum(n.targetLinks,y))})}function u(){for(var n,t=v,r=0;t.length;)n=[],t.forEach(function(t){t.x=r,t.dx=l,t.sourceLinks.forEach(function(t){n.indexOf(t.target)<0&&n.push(t.target)})}),t=n,++r;i(r),c((h[0]-l)/(r-1))}function i(n){v.forEach(function(t){t.sourceLinks.length||(t.x=n-1)})}function c(n){v.forEach(function(t){t.x*=n})}function f(n){function e(){u.forEach(function(n){var t,r,e,u=0,i=n.length;for(n.sort(o),e=0;e0&&(t.y+=r),u=t.y+t.dy+g;if((r=u-g-h[1])>0)for(u=t.y-=r,e=i-2;e>=0;--e)t=n[e],r=t.y+t.dy+g-u,r>0&&(t.y-=r),u=t.y})}function o(n,t){return n.y-t.y}var u=r.nest().key(function(n){return n.x}).sortKeys(t.ascending).entries(v).map(function(n){return n.values});!function(){var n=t.max(u,function(n){return n.length}),r=2/3*h[1]/(n-1);g>r&&(g=r);var e=t.min(u,function(n){return(h[1]-(n.length-1)*g)/t.sum(n,y)});u.forEach(function(n){n.forEach(function(n,t){n.y=t,n.dy=n.value*e})}),k.forEach(function(n){n.dy=n.value*e})}(),e();for(var i=1;n>0;--n)!function(n){function r(n){return s(n.target)*n.value}u.slice().reverse().forEach(function(e){e.forEach(function(e){if(e.sourceLinks.length){var o=t.sum(e.sourceLinks,r)/t.sum(e.sourceLinks,y);e.y+=(o-s(e))*n}})})}(i*=.99),e(),function(n){function r(n){return s(n.source)*n.value}u.forEach(function(e){e.forEach(function(e){if(e.targetLinks.length){var o=t.sum(e.targetLinks,r)/t.sum(e.targetLinks,y);e.y+=(o-s(e))*n}})})}(i),e()}function a(){function n(n,t){return n.source.y-t.source.y||n.originalIndex-t.originalIndex}function t(n,t){return n.target.y-t.target.y||n.originalIndex-t.originalIndex}v.forEach(function(r){r.sourceLinks.sort(t),r.targetLinks.sort(n)}),v.forEach(function(n){var t=0,r=0;n.sourceLinks.forEach(function(n){n.sy=t,t+=n.dy}),n.targetLinks.forEach(function(n){n.ty=r,r+=n.dy})})}function s(n){return n.y+n.dy/2}function y(n){return n.value}var d={},l=24,g=8,h=[1,1],v=[],k=[];return d.nodeWidth=function(n){return arguments.length?(l=+n,d):l},d.nodePadding=function(n){return arguments.length?(g=+n,d):g},d.nodes=function(n){return arguments.length?(v=n,d):v},d.links=function(n){return arguments.length?(k=n,d):k},d.size=function(n){return arguments.length?(h=n,d):h},d.layout=function(t){return n(),o(),u(),f(t),a(),d},d.relayout=function(){return a(),d},d.link=function(){function n(n){var r=n.source.x+n.source.dx,o=n.target.x,u=e.interpolateNumber(r,o),i=u(t),c=u(1-t),f=n.source.y+n.sy,a=f+n.dy,s=n.target.y+n.ty,y=s+n.dy;return"M"+r+","+f+"C"+i+","+f+" "+c+","+s+" "+o+","+s+"L"+o+","+y+"C"+c+","+y+" "+i+","+a+" "+r+","+a+"Z"}var t=.5;return n.curvature=function(r){return arguments.length?(t=+r,n):t},n},d};n.sankey=o,Object.defineProperty(n,"__esModule",{value:!0})}); \ No newline at end of file +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-array"),require("d3-collection"),require("d3-interpolate")):"function"==typeof define&&define.amd?define(["exports","d3-array","d3-collection","d3-interpolate"],t):t(n.d3=n.d3||{},n.d3,n.d3,n.d3)}(this,function(n,t,r,e){"use strict";var o=function(){function n(){v.forEach(function(n){n.sourceLinks=[],n.targetLinks=[]}),k.forEach(function(n,t){var r=n.source,e=n.target;"number"==typeof r&&(r=n.source=v[n.source]),"number"==typeof e&&(e=n.target=v[n.target]),n.originalIndex=t,r.sourceLinks.push(n),e.targetLinks.push(n)})}function o(){v.forEach(function(n){n.value=Math.max(t.sum(n.sourceLinks,y),t.sum(n.targetLinks,y))})}function u(){for(var n,t=v,r=0;t.length;)n=[],t.forEach(function(t){t.x=r,t.dx=l,t.sourceLinks.forEach(function(t){n.indexOf(t.target)<0&&n.push(t.target)})}),t=n,++r;i(r),c((h[0]-l)/(r-1))}function i(n){v.forEach(function(t){t.sourceLinks.length||(t.x=n-1)})}function c(n){v.forEach(function(t){t.x*=n})}function f(n){function e(){u.forEach(function(n){var t,r,e,u=0,i=n.length;for(n.sort(o),e=0;e0&&(t.y+=r),u=t.y+t.dy+g;if((r=u-g-h[1])>0)for(u=t.y-=r,e=i-2;e>=0;--e)t=n[e],r=t.y+t.dy+g-u,r>0&&(t.y-=r),u=t.y})}function o(n,t){return n.y-t.y}var u=r.nest().key(function(n){return n.x}).sortKeys(t.ascending).entries(v).map(function(n){return n.values});!function(){var n=t.max(u,function(n){return n.length}),r=x*h[1]/(n-1);g>r&&(g=r);var e=t.min(u,function(n){return(h[1]-(n.length-1)*g)/t.sum(n,y)});u.forEach(function(n){n.forEach(function(n,t){n.y=t,n.dy=n.value*e})}),k.forEach(function(n){n.dy=n.value*e})}(),e();for(var i=1;n>0;--n)!function(n){function r(n){return s(n.target)*n.value}u.slice().reverse().forEach(function(e){e.forEach(function(e){if(e.sourceLinks.length){var o=t.sum(e.sourceLinks,r)/t.sum(e.sourceLinks,y);e.y+=(o-s(e))*n}})})}(i*=.99),e(),function(n){function r(n){return s(n.source)*n.value}u.forEach(function(e){e.forEach(function(e){if(e.targetLinks.length){var o=t.sum(e.targetLinks,r)/t.sum(e.targetLinks,y);e.y+=(o-s(e))*n}})})}(i),e()}function a(){function n(n,t){return n.source.y-t.source.y||n.originalIndex-t.originalIndex}function t(n,t){return n.target.y-t.target.y||n.originalIndex-t.originalIndex}v.forEach(function(r){r.sourceLinks.sort(t),r.targetLinks.sort(n)}),v.forEach(function(n){var t=0,r=0;n.sourceLinks.forEach(function(n){n.sy=t,t+=n.dy}),n.targetLinks.forEach(function(n){n.ty=r,r+=n.dy})})}function s(n){return n.y+n.dy/2}function y(n){return n.value}var d={},l=24,g=8,h=[1,1],v=[],k=[],x=2/3;return d.nodeWidth=function(n){return arguments.length?(l=+n,d):l},d.nodePadding=function(n){return arguments.length?(g=+n,d):g},d.nodes=function(n){return arguments.length?(v=n,d):v},d.links=function(n){return arguments.length?(k=n,d):k},d.size=function(n){return arguments.length?(h=n,d):h},d.layout=function(t){return n(),o(),u(),f(t),a(),d},d.relayout=function(){return a(),d},d.link=function(){function n(n){var r=n.source.x+n.source.dx,o=n.target.x,u=e.interpolateNumber(r,o),i=u(t),c=u(1-t),f=n.source.y+n.sy,a=f+n.dy,s=n.target.y+n.ty,y=s+n.dy;return"M"+r+","+f+"C"+i+","+f+" "+c+","+s+" "+o+","+s+"L"+o+","+y+"C"+c+","+y+" "+i+","+a+" "+r+","+a+"Z"}var t=.5;return n.curvature=function(r){return arguments.length?(t=+r,n):t},n},d};n.sankey=o,Object.defineProperty(n,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/src/sankey.js b/src/sankey.js index 868d128..cc7ad20 100644 --- a/src/sankey.js +++ b/src/sankey.js @@ -8,7 +8,8 @@ export default function() { nodePadding = 8, size = [1, 1], nodes = [], - links = []; + links = [], + maxPaddedSpace = 2 / 3; // Defined as a fraction of the total available space sankey.nodeWidth = function(_) { if (!arguments.length) return nodeWidth; @@ -187,7 +188,7 @@ export default function() { var L = max(nodesByBreadth, function(nodes) { return nodes.length; }); - var maxNodePadding = 2/3 * size[1] / (L - 1); + var maxNodePadding = maxPaddedSpace * size[1] / (L - 1); if(nodePadding > maxNodePadding) nodePadding = maxNodePadding; var ky = min(nodesByBreadth, function(nodes) { return (size[1] - (nodes.length - 1) * nodePadding) / sum(nodes, value);