bam*_*oom 2 html javascript css d3.js
我D3.js从一开始就在学习。但是,在我正在阅读的教程的“输入元素”部分中,我无法获得与文章中相同的结果。
svg.selectAll("circle")
.data([32, 57, 112, 293])
.enter().append("circle")
.attr("cy", 60)
.attr("cx", function(d, i) { return i * 100 + 30; })
.attr("r", function(d) { return Math.sqrt(d); });
Run Code Online (Sandbox Code Playgroud)
绑定数据后,进入元素再追加一个circle,属性设置只适用于追加的circle,而不是所有的圆圈。
我特此附上代码笔。
这种行为是正常的还是我误解了什么?
是的,这是正常行为。这是您的问题:您在 SVG 中已经有 3 个圆圈。因此,当您绑定数据时,您的“输入”选择只有一个圆圈(第四个),并且所有属性都只为最后一个圆圈设置。
进入/更新/退出选择基于数据和元素之间的关系。当您绑定数据(数组中的 4 个数字)时,SVG 中已经有 3 个元素。因此,您有:
输入选择:数据不对应任何元素。在你的情况下,1圈。
更新选择:一个元素对应的数据。在你的情况下,3个圆圈。
退出选择:元素不对应任何数据。在你的情况下,零圈。
要重新绘制所有 4 个圆圈(3 个以前的和一个新的),您必须执行以下操作:
var svg = d3.select("svg");
var myCircles = svg.selectAll('circle')
.data([32, 57, 112, 293]);//binds the data
myCircles.enter().append("circle");//enter selection
myCircles.attr("cy", 60)
.attr("cx", function (d, i) {
return i * 100 + 30;
})
.attr("r", function(d) {
return Math.sqrt(d);
});//updates all circles
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以为“输入”和“更新”选择设置属性。这是你更新的 Pen(我设置了 1 秒的 setTimeout,只是为了让你看到更改前原来的 3 个圆圈):http : //codepen.io/anon/pen/vKxZxX
请注意,我不是将您的代码与 Bostock 的教程进行比较,也不是说您做错了什么。我只是在解释为什么您的代码没有更新 4 个圆圈。