Actualización de los datos de un diseño de paquete desde la llamada JSON y el redibujado

He estado jugando con elmuestra de paquete de círculo. Sin embargo, tengo muchos problemas al intentar actualizar el objeto desde un nuevo conjunto de datos JSON y luego actualizarlo.

Mi código es solo una versión modificada del ejemplo de paquete de círculo:

var diameter = 960,
    format = d3.format(",d");

var pack = d3.layout.pack()
    .size([diameter - 4, diameter - 4])
    .value(function(d) { return d.size; });

var svg = d3.select("body").append("svg")
    .attr("width", diameter)
    .attr("height", diameter)
    .append("g")
    .attr("transform", "translate(2,2)");

var node;

d3.json("data1.json", function(error, root) {

    node = svg.datum(root).selectAll(".node")
      .data(pack.nodes);

    node.enter().append("g")
      .classed("node", true)
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

    node.append("title")
      .text(function(d) { return d.name; });

    node.append("circle")
            .attr("r", 0)
        .on("click", refresh)
            .transition()
            .duration(2000)
        .attr("r", function(d) { return d.r; });

    node.append("text")
      .attr("dy", ".3em")
      .style("text-anchor", "middle")
      .text(function(d) { return d.name });

    node.exit()
        .remove();
});

d3.select(self.frameElement).style("height", diameter + "px");

Esto funciona como se esperaba. Sin embargo, quiero realizar la función de actualización que actualiza el gráfico a partir de nuevos datos JSON y se actualiza. He probado el código a continuación, pero simplemente agrega un nuevo elemento en lugar de cambiar los anteriores, y tampoco elimina los antiguos (node.exit.remove () aparentemente nunca se ejecuta). Me pregunto si tiene que ver con el uso de "datum" en lugar de "datos" y si realmente se realiza una unión de datos al respecto:

var refresh = function() {

    d3.json("data2.json", function(error, root2) {

        node = svg.datum(root2).selectAll(".node")
            .data(pack.nodes);

        node.append("title")
            .text(function(d) { return d.name; });

        node.append("circle")
            .attr("r", 0)
            .transition()
            .duration(2000)
            .attr("r", function(d) { return d.r; });

        node.append("text")
            .attr("dy", ".3em")
            .style("text-anchor", "middle")
            .text(function(d) { return d.name });
    });
}

Me cuesta bastante averiguar exactamente cómo los datos están realmente vinculados al paquete y cómo actualizarlos. Probablemente me esté perdiendo algo simple una vez más, pero cualquier ayuda sería muy apreciada ya que me ha costado mucho encontrar un ejemplo que ilustre esto. Felizmente haré uno para otros en el futuro si alguien puede ayudarme aquí. :)

Para el registro, los datos que estoy usando son estos:

{
    "name": "Names",
    "children": [
        { "name": "John", "size": 100 },
        { "name": "Peter", "size": 200 },
        { "name": "Arnold", "size": 300 },
        { "name": "Rasmus", "size": 400 }
    ]
}

y

{
    "name": "Names",
    "children": [
        { "name": "John", "size": 1000 },
        { "name": "Rasmus", "size": 200 },
        { "name": "Benjamin", "size": 300 },
        { "name": "James", "size": 400 }
    ]
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta