如何更新d3js中的分组条形图

时间:2017-10-17 18:21:17

标签: javascript d3.js

在此 plunker 中,我尝试以与 this 类似的方式更新基于新csv数据的柱形数据。

它获取新数据并更新矩形但不删除以前的数据。

我不知道代码的哪一部分没有正常工作,在之前的尝试中我省略.attr("transform", function(d) { return "translate(" + x0(d.State) + ",0)"; }) 并获得最左边的一组条形图来更新和删除以前的数据,但没有其他组显示。

感谢任何帮助!

编辑:上传了一个有效的示例 here

以下是相关代码:

let bars = g.selectAll(".test")
    .data(data)
bars = bars.enter().append("g")
    .attr("transform", function(d) { return "translate(" + x0(d.State) + ",0)"; })
    .selectAll("rect")
    .data(function(d) { 
        return keys.map(function(key) { 
            return {key: key, value: d[key]}; 
        }); 
    })
bars = bars
  .enter().append("rect")
    .attr("width", x1.bandwidth())
    .attr("x", function(d) { return x1(d.key); })
    .attr("fill", function(d) { return z(d.key); })
    .merge(bars)

bars.transition()
    .duration(750)
    .attr("y", function(d) { return y(d.value); })
    .attr("height", function(d) { return height - y(d.value); });

bars.exit().remove();

1 个答案:

答案 0 :(得分:1)

图表中的图层/组似乎不会根据新数据进行更新。以下是您可以对酒吧进行的一些更改。输入,更新和退出代码:

var barGroups = g.selectAll("g.layer").data(data); 
barGroups.enter().append("g").classed('layer', true)
    .attr("transform", function(d) { return "translate(" + x0(d.State) + ",0)"; });

barGroups.exit().remove(); 

var bars = g.selectAll("g.layer").selectAll("rect")
    .data(function(d) { 
        return keys.map(function(key) { 
            return {key: key, value: d[key]}; 
        }); 
    });
bars.enter().append("rect").attr("width", x1.bandwidth())
    .attr("x", function(d) { return x1(d.key); })
    .attr("fill", function(d) { return z(d.key); })
    .transition().duration(750)
    .attr("y", function(d) { return y(d.value); })
    .attr("height", function(d) { return height - y(d.value); });

bars
    .transition().duration(750)
    .attr("y", function(d) { return y(d.value); })
    .attr("height", function(d) { return height - y(d.value); });

bars.exit().remove();

因此,如果您查看代码,首先处理条形图组/图层,然后处理实际条形图,即矩形。如果这不起作用,请告诉我。

希望这会有所帮助。 :)