D3JS 包布局动态更新

D3JS Pack Layout Dynamic Update

我正在看这个来自 D3JS 的例子:http://bl.ocks.org/mbostock/4063530 我现在正尝试通过单击按钮使其成为 "dynamic"。 我编写了一个 refreshBasicBubbles 函数,但结果不起作用 - 因为半径没有按我的意愿更新。

    var diameter = 500,
        format = d3.format(",d"),
        color = d3.scale.category20c();

function buildBasicBubbles() {
    console.log("-> buildBasicBubbles");

    d3.selectAll(".add-data")
            .on("click", function() {
                refreshBasicBubbles();
            });

    var service = d3.layout.pack()
            .sort(null)
            .size([diameter, diameter])
            .padding(1.5);

    var svg = d3.select("#bubbles-basic-view")
            .append("svg")
            .attr("width", diameter)
            .attr("height", diameter);
//            .attr("class", "service");

    var dataSet = randomDataSet();

    var services = service.nodes(dataSet);
    console.log(services);

    var noeuds = svg.selectAll(".noeud")
            .data(services)
            .enter()
            .append("g")
            .attr("class", "noeud")
            .attr("transform", function(d) {
                return "translate(" + d.x + "," + d.y + ")";
            });

    noeuds.append("circle")
            .attr("r", function(d) {
                return d.r;
            })
            .attr("class", "circle")
            .attr("opacity", .75)
            .style("fill", function(d) {
                return color(d.className);
            });
}

function refreshBasicBubbles() {
    console.log("-> refreshBasicBubbles");

    var service = d3.layout.pack()
            .sort(null)
            .size([diameter, diameter])
            .padding(1.5);
    var dataSet = randomDataSet();
    var neoServices = service.nodes(dataSet);

    var svg = d3.select("svg");
    var noeuds = svg.selectAll(".noeud");
    noeuds.data(neoServices)
            .attr("class", "noeud")
            .attr("transform", function(d) {
                return "translate(" + d.x + "," + d.y + ")";
            });
    noeuds.selectAll("circle")
            .attr("r", function(d) {
                return d.r;
            })
            .attr("opacity", .75)
            .style("fill", function(d) {
                return color(d.className);
            });
}

function randomDataSet() {
    var classes = [];

    classes.push({packageName: "A Service", className: "A Service", value: randomSize()});
    classes.push({packageName: "B Service", className: "B Service", value: randomSize()});
    classes.push({packageName: "C Service", className: "C Service", value: randomSize()});
    classes.push({packageName: "D Service", className: "D Service", value: randomSize()});
    classes.push({packageName: "E Service", className: "E Service", value: randomSize()});

    return {children: classes};
}

function randomSize() {
    return 250 * Math.random();
}

提前致谢

看了这段代码找到了答案http://jsfiddle.net/VividD/WDCpq/5/

pack.nodes(data);
circles.transition()
       .duration(2000)
       .attr("cx", function(d) { return d.x; })
       .attr("cy", function(d) { return d.y; })

想法是"simply"(重新)打包数据(以便重新计算 x、y、r)。 然后对圆圈应用过渡