@@ -12,6 +12,77 @@ var tarjan = require('strongly-connected-components');
12
12
var Lib = require ( '../../lib' ) ;
13
13
var wrap = require ( '../../lib/gup' ) . wrap ;
14
14
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
+
15
86
function circularityPresent ( nodeList , sources , targets ) {
16
87
17
88
var nodeLen = nodeList . length ;
@@ -36,20 +107,16 @@ function circularityPresent(nodeList, sources, targets) {
36
107
}
37
108
38
109
module . exports = function calc ( gd , trace ) {
39
-
110
+ var circular = false ;
40
111
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 ;
49
113
}
50
114
115
+ var result = convertToD3Sankey ( trace ) ;
116
+
51
117
return wrap ( {
52
- link : trace . link ,
53
- node : trace . node
118
+ circular : circular ,
119
+ _nodes : result . nodes ,
120
+ _links : result . links
54
121
} ) ;
55
122
} ;
0 commit comments