Javascript 为什么当我的图形在d3中更改时,堆叠的条形图没有被删除?
我正在处理这个问题。我希望当我单击Javascript 为什么当我的图形在d3中更改时,堆叠的条形图没有被删除?,javascript,d3.js,stacked-chart,Javascript,D3.js,Stacked Chart,我正在处理这个问题。我希望当我单击WeekView按钮时,它会改变条形图的颜色,以反映与我的图例中相同的颜色。但由于某些原因,颜色是不同的 我不这么认为 var layer = svg.selectAll(".layer") .data(stack); layer.enter() .append("g") .attr("class", "layer") .style("fill", function (d, i) { return color(i); }
WeekView
按钮时,它会改变条形图的颜色,以反映与我的图例中相同的颜色。但由于某些原因,颜色是不同的
我不这么认为
var layer = svg.selectAll(".layer")
.data(stack);
layer.enter()
.append("g")
.attr("class", "layer")
.style("fill", function (d, i) {
return color(i);
});
layer.exit()
.remove();
当我切换到weekview时会调用,因此它不会用新的条替换旧的条,而只是重用以前视图中的条
如何让d3.js用正确的颜色替换这些条?事实上,问题在于代码的这一部分:
var-layer=svg.selectAll(“.layer”)
.数据(堆栈);
图层。输入()
.附加(“g”)
.attr(“类”、“层”);
//在“更新”循环中设置颜色,而不是在“输入”循环中设置颜色。
图层样式(“填充”,功能(d,i){
返回颜色(i);
});
layer.exit()
.remove();
有一段有趣的历史可以解释为什么会这样。在D3的早期版本中,enter
和update
元素集是分开的,就像update
和exit
事件仍然分开一样,即对update
集执行的操作不会对exit
集执行,反之亦然
但是,决定enter
阶段中附加的任何元素也将成为update
集合的一部分。之所以这样做,是因为通常enter
元素集和update
元素集需要对它们执行完全相同的操作(如您的案例)。为了避免这种影响,您需要在enter
阶段之前编写update
阶段
因此,在
enter
循环中,元素应该被附加
,它们的初始属性应该被设置,而它们的最终值(它们应该在静态状态下)应该在更新
循环中被设置。事实上,问题在于代码的这一部分:
var-layer=svg.selectAll(“.layer”)
.数据(堆栈);
图层。输入()
.附加(“g”)
.attr(“类”、“层”);
//在“更新”循环中设置颜色,而不是在“输入”循环中设置颜色。
图层样式(“填充”,功能(d,i){
返回颜色(i);
});
layer.exit()
.remove();
有一段有趣的历史可以解释为什么会这样。在D3的早期版本中,enter
和update
元素集是分开的,就像update
和exit
事件仍然分开一样,即对update
集执行的操作不会对exit
集执行,反之亦然
但是,决定enter
阶段中附加的任何元素也将成为update
集合的一部分。之所以这样做,是因为通常enter
元素集和update
元素集需要对它们执行完全相同的操作(如您的案例)。为了避免这种影响,您需要在enter
阶段之前编写update
阶段
因此,在
enter
循环中,元素应该被追加
,它们的初始属性应该被设置,而它们的最终值(它们应该是静态的)应该在更新
循环中被设置。谢谢你提出了一个很好的问题;我喜欢软件发展的历史。:)谢谢你的提问;我喜欢软件发展的历史。:)