|
1 var r = 960, |
|
2 format = d3.format(",d"), |
|
3 fill = d3.scale.category20c(); |
|
4 |
|
5 var bubble = d3.layout.pack() |
|
6 .sort(null) |
|
7 .size([r, r]); |
|
8 |
|
9 var vis = d3.select("#chart").append("svg:svg") |
|
10 .attr("width", r) |
|
11 .attr("height", r) |
|
12 .attr("class", "bubble"); |
|
13 |
|
14 d3.json("../data/flare.json", function(json) { |
|
15 var node = vis.selectAll("g.node") |
|
16 .data(bubble.nodes(classes(json)) |
|
17 .filter(function(d) { return !d.children; })) |
|
18 .enter().append("svg:g") |
|
19 .attr("class", "node") |
|
20 .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); |
|
21 |
|
22 node.append("svg:title") |
|
23 .text(function(d) { return d.className + ": " + format(d.value); }); |
|
24 |
|
25 node.append("svg:circle") |
|
26 .attr("r", function(d) { return d.r; }) |
|
27 .style("fill", function(d) { return fill(d.packageName); }); |
|
28 |
|
29 node.append("svg:text") |
|
30 .attr("text-anchor", "middle") |
|
31 .attr("dy", ".3em") |
|
32 .text(function(d) { return d.className.substring(0, d.r / 3); }); |
|
33 }); |
|
34 |
|
35 // Returns a flattened hierarchy containing all leaf nodes under the root. |
|
36 function classes(root) { |
|
37 var classes = []; |
|
38 |
|
39 function recurse(name, node) { |
|
40 if (node.children) node.children.forEach(function(child) { recurse(node.name, child); }); |
|
41 else classes.push({packageName: name, className: node.name, value: node.size}); |
|
42 } |
|
43 |
|
44 recurse(null, root); |
|
45 return {children: classes}; |
|
46 } |