【发布时间】:2013-01-25 11:48:06
【问题描述】:
我正在努力思考 d3 的包布局 (http://bl.ocks.org/4063530)。
我的基本布局工作正常,但我想用新数据更新它。即收集新数据,将其绑定到当前 layout.pack 并相应更新(更新/退出/进入)。
我的尝试在这里(http://jsfiddle.net/emepyc/n4xk8/14/):
var bPack = function(vis) {
var pack = d3.layout.pack()
.size([400,400])
.value(function(d) {return d.time});
var node = vis.data([data])
.selectAll("g.node")
.data(pack.nodes)
.enter()
.append("g")
.attr("class", function(d) { return d.children ? "node" : "leaf node"; })
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
node.append("circle")
.attr("r", function(d) { return d.r });
node.filter(function(d) { return !d.children; }).append("text")
.attr("text-anchor", "middle")
.attr("dy", ".3em")
.text(function(d) { return d.analysis_id });
bPack.update = function(new_data) {
console.log("UPDATE");
node
.data([new_data])
.selectAll("g.node")
.data(pack.nodes);
node
.transition()
.duration(1000)
.attr("class", function(d) { return d.children ? "node" : "leaf node" })
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")" });
node.selectAll("circle")
.data(new_data)
.transition()
.duration(1000)
.attr("r", function(d) { return d.r; });
};
具体问题...
如何绑定数据? (因为数据不是复杂的结构,也不是数据数组)
如何将新节点/叶子添加到布局中?旧的被删除了?
非常感谢您提供指向工作示例的指针。
【问题讨论】:
-
我知道你问这个问题已经有一段时间了,但你能看看我的解决方案吗?我很好奇它是否是您困境的正确答案。也许其他人对您的问题如何解决感兴趣,如果它解决了...... :)
-
是的,答案是让包布局为您完成所有工作。当我开始研究此问题时,这并不明显,但我发现解决方案在另一个示例中有效(更新树布局)。感谢您的工作示例。
-
很高兴您设法解决了这个问题。通常情况下,最终的解决方案很简单,但在您第一次解决问题时并不明显。我非常喜欢这些案例。
标签: javascript data-binding d3.js transition circle-pack