@@ -12,6 +12,77 @@ var tarjan = require('strongly-connected-components');
1212var Lib = require ( '../../lib' ) ;
1313var wrap = require ( '../../lib/gup' ) . wrap ;
1414
15+ var isArrayOrTypedArray = Lib . isArrayOrTypedArray ;
16+ var isIndex = Lib . isIndex ;
17+
18+
19+ function convertToD3Sankey ( trace ) {
20+ var nodeSpec = trace . node ;
21+ var linkSpec = trace . link ;
22+
23+ var links = [ ] ;
24+ var hasLinkColorArray = isArrayOrTypedArray ( linkSpec . color ) ;
25+ var linkedNodes = { } ;
26+
27+ var nodeCount = nodeSpec . label . length ;
28+ var i ;
29+ for ( i = 0 ; i < linkSpec . value . length ; i ++ ) {
30+ var val = linkSpec . value [ i ] ;
31+ // remove negative values, but keep zeros with special treatment
32+ var source = linkSpec . source [ i ] ;
33+ var target = linkSpec . target [ i ] ;
34+ if ( ! ( val > 0 && isIndex ( source , nodeCount ) && isIndex ( target , nodeCount ) ) ) {
35+ continue ;
36+ }
37+
38+ source = + source ;
39+ target = + target ;
40+ linkedNodes [ source ] = linkedNodes [ target ] = true ;
41+
42+ var label = '' ;
43+ if ( linkSpec . label && linkSpec . label [ i ] ) label = linkSpec . label [ i ] ;
44+
45+ links . push ( {
46+ pointNumber : i ,
47+ label : label ,
48+ color : hasLinkColorArray ? linkSpec . color [ i ] : linkSpec . color ,
49+ source : source ,
50+ target : target ,
51+ value : + val
52+ } ) ;
53+ }
54+
55+ var hasNodeColorArray = isArrayOrTypedArray ( nodeSpec . color ) ;
56+ var nodes = [ ] ;
57+ var removedNodes = false ;
58+ var nodeIndices = { } ;
59+
60+ for ( i = 0 ; i < nodeCount ; i ++ ) {
61+ if ( linkedNodes [ i ] ) {
62+ var l = nodeSpec . label [ i ] ;
63+ nodeIndices [ i ] = nodes . length ;
64+ nodes . push ( {
65+ pointNumber : i ,
66+ label : l ,
67+ color : hasNodeColorArray ? nodeSpec . color [ i ] : nodeSpec . color
68+ } ) ;
69+ } else removedNodes = true ;
70+ }
71+
72+ // need to re-index links now, since we didn't put all the nodes in
73+ if ( removedNodes ) {
74+ for ( i = 0 ; i < links . length ; i ++ ) {
75+ links [ i ] . source = nodeIndices [ links [ i ] . source ] ;
76+ links [ i ] . target = nodeIndices [ links [ i ] . target ] ;
77+ }
78+ }
79+
80+ return {
81+ links : links ,
82+ nodes : nodes
83+ } ;
84+ }
85+
1586function circularityPresent ( nodeList , sources , targets ) {
1687
1788 var nodeLen = nodeList . length ;
@@ -36,20 +107,16 @@ function circularityPresent(nodeList, sources, targets) {
36107}
37108
38109module . exports = function calc ( gd , trace ) {
39-
110+ var circular = false ;
40111 if ( circularityPresent ( trace . node . label , trace . link . source , trace . link . target ) ) {
41- Lib . error ( 'Circularity is present in the Sankey data. Removing all nodes and links.' ) ;
42- trace . link . label = [ ] ;
43- trace . link . source = [ ] ;
44- trace . link . target = [ ] ;
45- trace . link . value = [ ] ;
46- trace . link . color = [ ] ;
47- trace . node . label = [ ] ;
48- trace . node . color = [ ] ;
112+ circular = true ;
49113 }
50114
115+ var result = convertToD3Sankey ( trace ) ;
116+
51117 return wrap ( {
52- link : trace . link ,
53- node : trace . node
118+ circular : circular ,
119+ _nodes : result . nodes ,
120+ _links : result . links
54121 } ) ;
55122} ;
0 commit comments