【发布时间】:2018-04-14 11:33:43
【问题描述】:
尽管阅读了无数次 D3 API,但我仍在努力理解 D3 中的合并功能。
API 说:“此方法通常用于在数据连接后合并输入和更新选择。分别修改输入和更新元素后,您可以合并两个选择并在两者上执行操作,而无需重复代码。 "
这是一个在力导向图表中被认为是直接使用它的示例,其中每个刻度都会调用刻度函数:
var simulation = d3.forceSimulation(nodes)
.force("charge", chargeForce)
.force("center", centerForce)
.on("tick", ticked);
function ticked() {
var u = d3.select("svg").selectAll("circle").data(nodes)
u.enter().append("circle").attr("r",5)
.merge(u) // What is the merge function doing here?
.attr("cx", d => d.x)
.attr("cy", d => d.y)
u.exit().remove() // Why is it necessary to remove excess objects w/ the exit selection?
}
我了解数据绑定的工作原理,以及 enter() 和 exit() 选择的工作原理。但是,我以前从未使用过“合并”,我不明白它在这里做什么。如果有人可以逐步简要介绍此功能中发生的事情,那将非常有用。我相信其他人也有类似的问题。
【问题讨论】:
-
你从哪里得到这个例子的?您应该不在 tick 函数中添加元素或重新绑定数据。
-
很难理解的是,您有 2 个选择并将它们组合成 1 个选择。就像你有 2 个数组,A 和 B。你可以将它们连接成数组 C。
-
@EricGuan 你说的不正确:
merge()不连接选择。 API 明确声明:“此方法不适用于连接任意选择,但是:如果此选择和指定的其他选择在同一索引处都有(非空)元素,此选择的元素在合并中返回,而另一个选择的元素被忽略。". -
@GerardoFurtado 我在这里找到了:d3indepth.com/force-layout,为什么这样做没有意义?
-
@HarryCramer 这很容易理解:为什么要重新绑定数据并每秒计算数十次进入和退出选择,如果数据没有改变乙>?这没有道理!我刚刚用替代代码写了一个解释它的答案。
标签: javascript d3.js data-visualization