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
循环中,元素应该被
追加
,它们的初始属性应该被设置,而它们的最终值(它们应该是静态的)应该在
更新
循环中被设置。

谢谢你提出了一个很好的问题;我喜欢软件发展的历史。:)谢谢你的提问;我喜欢软件发展的历史。:)