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)。
然后对圆圈应用过渡
我正在看这个来自 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)。 然后对圆圈应用过渡