This is a classic case when you need to fix the input selection in an element of the svg:g group in order to correctly apply the input / update / output template. But in order to keep the object constant , and so that your labels still point to the necessary elements, you also need to enter data based on some data property of interest ( d.className , which is generated from d.name ).
Here is the main segment of your updated bubble update feature:
var node = svg.selectAll(".node") .data( bubble.nodes(classes(root)).filter(function (d){return !d.children;}), function(d) {return d.className} // key data based on className to keep object constancy ); // capture the enter selection var nodeEnter = node.enter() .append("g") .attr("class", "node") .attr("transform", function (d) { return "translate(" + dx + "," + dy + ")"; }); // re-use enter selection for circles nodeEnter .append("circle") .attr("r", function (d) {return dr;}) .style("fill", function (d, i) {return color(i);}) // re-use enter selection for titles nodeEnter .append("title") .text(function (d) { return d.className + ": " + format(d.value); });
Full FIDDLE is here.
I also blog on applying an input / update / exit pattern to svg:g elements if you are interested.
FernOfTheAndes
source share