forked from d3/d3-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrollup.js
131 lines (116 loc) · 3.06 KB
/
rollup.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
d3.rollup = function() {
var directed = true,
x_ = rollupX,
y_ = rollupY,
nodes_ = rollupNodes,
links_ = rollupLinks,
linkValue = rollupLinkValue,
linkSource = rollupLinkSource,
linkTarget = rollupLinkTarget;
function rollup(d, i) {
var nodes = nodes_.call(this, d, i),
links = links_.call(this, d, i),
n = nodes.length,
m = links.length,
i = -1,
x = [],
y = [],
rnindex = 0,
rnodes = {},
rlinks = {};
// Compute rollup nodes.
while (++i < n) {
(d = nodes[i]).index = i;
x[i] = x_.call(this, d, i);
y[i] = y_.call(this, d, i);
var nodeId = id(i),
rn = rnodes[nodeId];
if (!rn) {
rn = rnodes[nodeId] = {
index: rnindex++,
x: x[i],
y: y[i],
nodes: []
};
}
rn.nodes.push(d);
}
// Compute rollup links.
i = -1; while (++i < m) {
var value = linkValue.call(this, d = links[i], i),
source = linkSource.call(this, d, i),
target = linkTarget.call(this, d, i),
rsource = rnodes[id(typeof source === "number" ? source : source.index)],
rtarget = rnodes[id(typeof target === "number" ? target : target.index)],
linkId = !directed && rsource.index > rtarget.index
? rtarget.index + "," + rsource.index
: rsource.index + "," + rtarget.index,
rl = rlinks[linkId];
if (!rl) {
rl = rlinks[linkId] = {
source: rsource,
target: rtarget,
value: 0,
links: []
};
}
rl.links.push(links[i]);
rl.value += value;
}
return {
nodes: d3.values(rnodes),
links: d3.values(rlinks)
};
function id(i) {
return x[i] + "," + y[i];
}
}
rollup.x = function(x) {
if (!arguments.length) return x_;
x_ = x;
return rollup;
};
rollup.y = function(x) {
if (!arguments.length) return y_;
y_ = x;
return rollup;
};
rollup.nodes = function(x) {
if (!arguments.length) return nodes_;
nodes_ = x;
return rollup;
};
rollup.links = function(x) {
if (!arguments.length) return links_;
links_ = x;
return rollup;
};
rollup.linkSource = function(x) {
if (!arguments.length) return linkSource;
linkSource = x;
return rollup;
};
rollup.linkTarget = function(x) {
if (!arguments.length) return linkTarget;
linkTarget = x;
return rollup;
};
rollup.linkValue = function(x) {
if (!arguments.length) return linkValue;
linkValue = x;
return rollup;
};
rollup.directed = function(x) {
if (!arguments.length) return directed;
directed = x;
return rollup;
};
return rollup;
function rollupX(d) { return d.x; }
function rollupY(d) { return d.y; }
function rollupNodes(d) { return d.nodes; }
function rollupLinks(d) { return d.links; }
function rollupLinkValue(d) { return 1; }
function rollupLinkSource(d) { return d.source; }
function rollupLinkTarget(d) { return d.target; }
};