D3 燃尽图的数据刷新问题

Data refresh issue with D3 burnup chart

我正在构建一个“燃尽”d3 折线图,试图根据范围和历史数据预测趋势。

下拉框选择要显示的数据,理想情况下是在行之间转换,但我在清除之前显示的数据时遇到了麻烦,而是新行被写入现有行。

Link 到 jsfiddle:https://jsfiddle.net/dgf1vts8/

目前正在这样做(第 329 行):

svg.append("path")
      .datum(selectedData)
      .attr("class", "line")
      .attr("d", line);

我尝试过但没有奏效的其他方法(第 318 行)

var lines = svg.selectAll(".line").data(selectedData).attr("class","line");
    lines.transition().duration(500).attr("d",line);
    lines.enter()
      .append("path")
      .attr("class","line")
      .attr("d",line);
    lines.exit()
      .remove();

如有任何指导,我们将不胜感激

由于您只在更新函数中追加新对象,因此每次调用该函数时都会在图表中添加一个新行。

最简单的解决方法是在添加新路径对象之前删除所有路径对象。

svg.selectAll("path").remove();

但是,enter-update-exit 的逻辑是

  var lines = svg.selectAll(".line").data(selectedGroup);
  lines.enter() // enter any new data
    .append("path")
    .attr("class", "line")
    .merge(lines)
    .datum(selectedData)
    .attr("d", line);
  lines.exit() // exit
    .remove();

lines 的逻辑与 e 不同。 G。点或条,您需要在其中为时间序列的每个数据点创建一个对象。对于线条,您只需创建一个路径对象。这就是为什么数据绑定到选择

svg.selectAll(".line")

应该是行的标签。如果您使用多行,通常最好嵌套数组。

如果您开始一个新项目,您可能应该使用当前版本的 d3v7 而不是 d3v3,因为发生了破坏兼容性的重大变化。我减少了你的 fiddle 并更改了所有部分以使其与 d3v7 一起工作:https://jsfiddle.net/esd4kofr/1/