3
<title>PivotGraph (Rollup) Layout</title>
7
font-family: sans-serif;
23
<script src="../../d3.v2.js"></script>
28
{gender: "M", group: 1},
29
{gender: "F", group: 2},
30
{gender: "M", group: 1},
31
{gender: "M", group: 2},
32
{gender: "F", group: 2},
33
{gender: "M", group: 1},
34
{gender: "F", group: 1},
35
{gender: "M", group: 2},
36
{gender: "F", group: 2},
37
{gender: "F", group: 2}
40
{source: 0, target: 1},
41
{source: 1, target: 2},
42
{source: 2, target: 3},
43
{source: 2, target: 4},
44
{source: 2, target: 5},
45
{source: 2, target: 6},
46
{source: 2, target: 7},
47
{source: 5, target: 6},
48
{source: 6, target: 7},
49
{source: 5, target: 8},
50
{source: 8, target: 6},
51
{source: 6, target: 9}
59
var x = d3.scale.ordinal()
60
.domain(social.nodes.map(fx))
63
var y = d3.scale.ordinal()
64
.domain(social.nodes.map(fy))
67
function fx(d) { return d.gender; }
68
function fy(d) { return d.group; }
70
var vis = d3.select("body").append("svg")
71
.attr("width", width + 2 * margin)
72
.attr("height", height + 2 * margin)
74
.attr("transform", "translate(" + [margin, margin] + ")");
77
.x(function(d) { return x(fx(d)); })
78
.y(function(d) { return y(fy(d)); });
80
var g = layout(social);
84
.enter().append("path")
85
.style("stroke-width", function(d) { return d.value * 1.5; })
86
.attr("d", function(d) {
93
dr = 2 * Math.sqrt(dx * dx + dy * dy);
94
return "M" + sx + "," + sy + "A" + dr + "," + dr + " 0 0,1 " + tx + "," + ty;
97
vis.selectAll("circle")
99
.enter().append("circle")
100
.attr("r", function(d) { return Math.sqrt(d.nodes.length * 20); })
101
.attr("cx", function(d) { return d.x; })
102
.attr("cy", function(d) { return d.y; });
104
vis.selectAll("text.x")
106
.enter().append("text")
110
.attr("text-anchor", "middle")
113
vis.selectAll("text.y")
115
.enter().append("text")
120
.attr("text-anchor", "end")
127
nodes_ = rollupNodes,
128
links_ = rollupLinks,
129
linkValue = rollupLinkValue,
130
linkSource = rollupLinkSource,
131
linkTarget = rollupLinkTarget;
133
function rollup(d, i) {
134
var nodes = nodes_.call(this, d, i),
135
links = links_.call(this, d, i),
145
// Compute rollup nodes.
147
(d = nodes[i]).index = i;
148
x[i] = x_.call(this, d, i);
149
y[i] = y_.call(this, d, i);
153
rn = rnodes[nodeId] = {
163
// Compute rollup links.
164
i = -1; while (++i < m) {
165
var value = linkValue.call(this, d = links[i], i),
166
source = linkSource.call(this, d, i),
167
target = linkTarget.call(this, d, i),
168
rsource = rnodes[id(typeof source === "number" ? source : source.index)],
169
rtarget = rnodes[id(typeof target === "number" ? target : target.index)],
170
linkId = !directed && rsource.index > rtarget.index
171
? rtarget.index + "," + rsource.index
172
: rsource.index + "," + rtarget.index,
175
rl = rlinks[linkId] = {
182
rl.links.push(links[i]);
187
nodes: d3.values(rnodes),
188
links: d3.values(rlinks)
192
return x[i] + "," + y[i];
196
rollup.x = function(x) {
197
if (!arguments.length) return x_;
202
rollup.y = function(x) {
203
if (!arguments.length) return y_;
208
rollup.nodes = function(x) {
209
if (!arguments.length) return nodes_;
214
rollup.links = function(x) {
215
if (!arguments.length) return links_;
220
rollup.linkSource = function(x) {
221
if (!arguments.length) return linkSource;
226
rollup.linkTarget = function(x) {
227
if (!arguments.length) return linkTarget;
232
rollup.linkValue = function(x) {
233
if (!arguments.length) return linkValue;
238
rollup.directed = function(x) {
239
if (!arguments.length) return directed;
246
function rollupX(d) { return d.x; }
247
function rollupY(d) { return d.y; }
248
function rollupNodes(d) { return d.nodes; }
249
function rollupLinks(d) { return d.links; }
250
function rollupLinkValue(d) { return 1; }
251
function rollupLinkSource(d) { return d.source; }
252
function rollupLinkTarget(d) { return d.target; }