How to update data in stack bar chart in D3

前端 未结 1 564
情话喂你
情话喂你 2020-12-10 09:07

I am able to populate a stacked bar chart first time, but my requirement is to update the stacked bar chart with new data on button click. On button click, i m making call

1条回答
  •  有刺的猬
    2020-12-10 09:52

    To update your data you will just need to select the svg elements again and rebind the data. In your example you are already selecting the #barchart, now you just need to rebind the data. And you can do that in the same way you did it when you first created the svg Elements. So something like this should do the trick:

    var updatebar = svg.selectAll("#barchart");
    .data(newdata)
    .transition()
    .duration(500)
    ... (etc.)
    

    Here you can find a more detailed explaination: http://chimera.labs.oreilly.com/books/1230000000345/ch09.html#_updating_data

    Update:

    Ok, unfortunately I cannot use Fiddle so I just post my working code here. As far as I could see you have a problem with your selectAll, because there is no element called .effort. Here is the updated code for your redraw-function:

    function redraw() {
    
        var effort = [];
        var obj = {
            pfte: "20",
            efte: "50",
            qName: "Q1"
        };
        var obj2 = {
            pfte: "10",
            efte: "13",
            qName: "Q2"
        };
    
        effort[0] = obj;
        effort[1] = obj2;
        var newDataSet = new Object();
        newDataSet.effort = effort;
    
        color.domain(d3.keys(newDataSet.effort[0]).filter(function (key) {
            return key !== "qName";
        }));
    
        effortDataSet = newDataSet.effort;
        effortDataSet.forEach(function (d) {
            var y0 = 0;
            d.effortHr = color.domain().map(function (name) {
                return { name: name, y0: y0, y1: y0 += +d[name] };
            });
            d.total = d.effortHr[d.effortHr.length - 1].y1;
        });
    
        state = svg.selectAll(".g")
            .data(effortDataSet)
            .attr("class", "g")
            .attr("transform", function (d) { return "translate(" + x(d.qName) + ",0)"; });
    
        state = state.selectAll("rect")
            .data(function (d) {
                return d.effortHr;
            })
            .attr("width", x.rangeBand())
            .attr("y", function (d) {
                return y(d.y1);
            })
            .attr("height", function (d) {
            //console.log(y(d.y0) - y(d.y1));
            return y(d.y0) - y(d.y1);
            })
            .style("fill", function (d) { return color(d.name); });
    }
    

    0 讨论(0)
提交回复
热议问题