The call to bubble.nodes()
boils down to a call to d3.layout.pack().nodes()
since bubble=d3.layout.pack()
. The trick is that pack.nodes()
is hardcoded to use the value
key of the input's children
(in this case all the packages) to size the nodes (add r
) and determine position (add x
and y
).
In essence,
var root = {"children": [
{"packageName":"cluster","className":"AgglomerativeCluster","value":3938},
{"packageName":"cluster","className":"CommunityStructure","value":3812},
{"packageName":"cluster","className":"HierarchicalCluster","value":6714},
{"packageName":"cluster","className":"MergeEdge","value":743}
]}; // This is an excerpt of the real data.
var bubble = d3.layout.pack();
// pack.nodes() assigns each element of "children" a r, x, and y based on value
bubble.nodes(root);
This tripped me up at first as well, you can see that classes()
doesn't add r
, x
, and y
since classes(root)
doesn't have those attributes. krasnaya's answer touched on most of this but I felt that it needed a bit more explaining (at least it did for me).
classes
inside the function has extra properties that are assigned before being based into bubble.nodes. Documentation also doesn't explain ther
attribute. – Wiltshirer
property is the node radius computed by the layout. – Afro