D3.js D3 exit().remove()在堆栈面积图上

D3.js D3 exit().remove()在堆栈面积图上,d3.js,D3.js,我正在创建的堆叠面积图中的exit.remove函数有问题 请点击此处: 我有一些功能,用户可以通过单击图例矩形/颜色来启用/禁用图表中的数据。我知道数据正在根据控制台消息和Y轴变化比例进行更新,但图表中的数据没有变化。例如,如果用户取消选择失败的类别,橙色层应消失,失败和通过的层应重新调整 问题似乎出现在小提琴的第214到234行中,特别是在我调用exit.remove的地方: 我得到的错误是Object[Object Array]没有方法出口。我尝试将selectAll更改为select,但

我正在创建的堆叠面积图中的exit.remove函数有问题

请点击此处:

我有一些功能,用户可以通过单击图例矩形/颜色来启用/禁用图表中的数据。我知道数据正在根据控制台消息和Y轴变化比例进行更新,但图表中的数据没有变化。例如,如果用户取消选择失败的类别,橙色层应消失,失败和通过的层应重新调整

问题似乎出现在小提琴的第214到234行中,特别是在我调用exit.remove的地方:


我得到的错误是Object[Object Array]没有方法出口。我尝试将selectAll更改为select,但这也会产生相同的错误。提前谢谢。

我终于让它工作了。下面的代码将正确更新图层:

// filter the data
var updatedData = dataSeries.filter(function(d) {
    if(d.vis === "1"){
        return d;
    }
    else {
        return null;
    }
});

stack(updatedData);

var sel = main_layer.select(".layer");

sel
    .attr("class", function(d) { return d.key + " layer"; })
    .style("fill", function(d, i) { 
        if(d.vis === "1") {
            return z(i);   
        }
        else return null;
    })
    .attr("d", function(d) { 
        if(d.vis === "1") {
            return main_area(d.values); 
        }
        else return null;
    });

你能在.exit调用之前添加一个断点,看看主层是什么吗?从错误消息来看,它似乎被重新分配给了D3选择以外的其他对象。您需要对选择进行操作,而不是对主层进行操作-var sel=main\u layer.selectAll.layer.datalayer;sel.exit.remove;。向小提琴添加了调试语句。Lars,我也更新了你的解决方案,但是我得到了一些奇怪的结果。我将尝试调试正在发生的事情。我做了一些额外的更新。这很奇怪;过滤后的数据仍然如预期的那样通过,但当它到达第234行调用d.key时,所有键都是相同的,即:全部“失败”,而不是三个不同的键。我最终得到了这个工作…将在一分钟内发布答案。拉尔斯,谢谢你的帮助-你的建议帮助我克服了我遇到的一个主要问题。
// filter the data
var updatedData = dataSeries.filter(function(d) {
    if(d.vis === "1"){
        return d;
    }
    else {
        return null;
    }
});

stack(updatedData);

var sel = main_layer.select(".layer");

sel
    .attr("class", function(d) { return d.key + " layer"; })
    .style("fill", function(d, i) { 
        if(d.vis === "1") {
            return z(i);   
        }
        else return null;
    })
    .attr("d", function(d) { 
        if(d.vis === "1") {
            return main_area(d.values); 
        }
        else return null;
    });