Updating D3 streamgraph with new data

流过昼夜 提交于 2019-12-10 11:08:20

问题


I have a streamgraph and I would like to update it by changing its data. I have a line graph which transitions between data sets perfectly and I am trying to adapt the same code for my streamgraph but with little success. I can change the color of each stream but not the data.

Here is my update line function

  function UpdateData() {
    // Get new data
    d3.csv("data2.csv", function(data) {
        data.forEach(function(d) {
            d.date = parseDate(d.date);
            d.age = +d.age;
        });

    // Rescale range
    x.domain(d3.extent(data, function(d) { return d.date; }));
    y.domain([0, d3.max(data, function(d) { return Math.max(d.age); })]);

    var valueline = d3.svg.line()
        //.interpolate("interpolation")
        .x(function(d) { return x(d.date); })
        .y(function(d) { return y(d.age); });

    var svg = d3.select("body").transition();

    // change the line
    svg.select(".line") 
        .duration(750)
        .attr("d", valueline(data));

    svg.select(".x.axis") // change the x axis
        .duration(750)
        .call(xAxis);

    svg.select(".y.axis") // change the y axis
        .duration(750)
        .call(yAxis);
    });}    

Here is my attempt at the same function for my streamgraph...

function UpdateData() {             
    var customPalette = ["#8c564b", "#e377c2", "#7f7f7f"];        
    var colours = d3.scale.ordinal().range(customPalette);
    var nest = d3.nest().key(function(d) { return d.age; });

    // Get new data
    d3.csv("data2.csv", function(error, data) {
    data.forEach(function(d) {
            d.date = format.parse(d.date);
            d.amount = +d.amount;
        });

    var svg = d3.select("body").transition();

    var layers = stack(nest.entries(data));

        x.domain(d3.extent(data, function(d) { return d.date; }));
        y.domain([0, d3.max(data, function(d) { return d.y0 + d.y; })]);

        svg.selectAll(".layer")
            .duration(750)
            .data(layers)
            .attr("class", "layer")
            .attr("d", function(d) { return (d.values); })
            .style("fill", function(d, i) { return colours(i); });                
        });
    }

The colors change but the values wont pass to the graph. Any advice or suggestions would be hugely appreciated!!


回答1:


Success!!

Finally got it. Instead of targeting layers, I should have been targeting the paths themselves!

So, call your new data,

    // Get the data again
    d3.csv("PopulationStats/UK.csv", function(error, data) {
        data.forEach(function(d) {
            d.date = format.parse(d.date);
            d.amount = +d.amount;
        });

Nest it

var layers = stack(nest.entries(data));

And update your paths.

   d3.selectAll("path")
   .data(layers)
  .transition()
   .duration(750)
   .style("fill", function(d, i) { return colours(i); })
   .attr("d", function(d) { return area(d.values); });

So simple, but took me 2 days to figure out!




回答2:


Just a heads-up for anyone else who finds this -- the same technique also works to update the data in the Stacked Area Chart example (http://bl.ocks.org/mbostock/3885211). Was banging my head against the computer for a solid 4 hours until I stumbled across this. Thanks Daft!



来源:https://stackoverflow.com/questions/14926692/updating-d3-streamgraph-with-new-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!