score:3

Accepted answer

Right now you're just adding this line at the end of Bostock's code:

city.exit().remove();

However, this will not work because his code has just one "enter" selection.

The solution is creating a data-binding selection and a separated "enter" selection. That way, you'll have a working "exit" selection:

var city = g.selectAll(".city")
    .data(cities);

city.exit().remove();

var cityEnter = city.enter().append("g")
    .attr("class", "city");

cityEnter.append("path")
    //etc...

cityEnter.append("text")
    //etc..

Here is a demo bl.ocks with that change, every time you click the button at the top it removes the first object in the data array, and the exit selection removes the line:

https://bl.ocks.org/anonymous/98204ee0226e2f6178154b7903f9ef99

EDIT: In your original question you only asked about the exit selection. Since you are actually asking about the update selection, here is a new demo, updating the lines, the texts and the axis:

<script src="https://d3js.org/d3.v4.min.js"></script>
<style>
  .axis--x path {
    display: none;
  }
  
  .line {
    fill: none;
    stroke: steelblue;
    stroke-width: 1.5px;
  }

</style>
<button>Click me</button>
<svg width="960" height="500"></svg>
<!--<script src="//d3js.org/d3.v4.min.js"></script>-->
<script src="d3.v4.js"></script>

<!--<script src="v03-exit-funktioniert-3-evolution.js"></script>-->

<script>
  var svg = d3.select("svg"),
    margin = {
      top: 20,
      right: 80,
      bottom: 30,
      left: 50
    },
    width = svg.attr("width") - margin.left - margin.right,
    height = svg.attr("height") - margin.top - margin.bottom,
    g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");

  var parseTime = d3.timeParse("%Y%m%d");

  var x = d3.scaleTime().range([0, width]),
    y = d3.scaleLinear().range([height, 0]),
    z = d3.scaleOrdinal(d3.schemeCategory10);

  var line = d3.line()
    .curve(d3.curveBasis)
    .x(function(d) {
      return x(d.date);
    })
    .y(function(d) {
      return y(d.temperature);
    });

  var data = [{
    "date": "1136156400000",
    "New York": 63.4,
    "San Francisco": 62.7,
    "Austin": 72.2
  }, {
    "date": "1167692400000",
    "New York": 58.0,
    "San Francisco": 59.9,
    "Austin": 67.7
  }, {
    "date": "1199228400000",
    "New York": 53.3,
    "San Francisco": 59.1,
    "Austin": 69.4
  }, {
    "date": "1230850800000",
    "New York": 55.7,
    "San Francisco": 58.8,
    "Austin": 68.0
  }, {
    "date": "1262386800000",
    "New York": 62.3,
    "San Francisco": 55.1,
    "Austin": 71.9
  }];

  var data2 = [{
    "date": "1136156400000",
    "New York": 163.4,
    "San Francisco": 262.7,
    "Austin": 372.2
  }, {
    "date": "1167692400000",
    "New York": 158.0,
    "San Francisco": 259.9,
    "Austin": 367.7
  }, {
    "date": "1199228400000",
    "New York": 153.3,
    "San Francisco": 259.1,
    "Austin": 369.4
  }, {
    "date": "1230850800000",
    "New York": 155.7,
    "San Francisco": 258.8,
    "Austin": 368.0
  }, {
    "date": "1262386800000",
    "New York": 162.3,
    "San Francisco": 255.1,
    "Austin": 371.9
  }];


  // d3.tsv("data.tsv", type, function (error, data) {
  //     if (error) throw error;

  data.columns = ["date", "New York", "San Francisco", "Austin"];

  var cities = data.columns.slice(1).map(function(id) {
    return {
      id: id,
      values: data.map(function(d) {
        return {
          date: d.date,
          temperature: d[id]
        };
      })
    };
  });

  x.domain(d3.extent(data, function(d) {
    return d.date;
  }));

  y.domain([
    d3.min(cities, function(c) {
      return d3.min(c.values, function(d) {
        return d.temperature;
      });
    }),
    d3.max(cities, function(c) {
      return d3.max(c.values, function(d) {
        return d.temperature;
      });
    })
  ]);
  g.append("g")
    .attr("class", "axis axis--x")
    .attr("transform", "translate(0," + height + ")")
    .call(d3.axisBottom(x));
  g.append("g")
    .attr("class", "axis axis--y")
    .call(d3.axisLeft(y))
    .append("text")
    .attr("transform", "rotate(-90)")
    .attr("y", 6)
    .attr("dy", "0.71em")
    .attr("fill", "#000")
    .text("Temperature, ºF");
  update();
  d3.select("button").on("click", function() {
    // cities.splice(0, 1);
    data = data2;
    //            console.log(JSON.stringify(cities));
    update();
  });

  function update() {
    data.columns = ["date", "New York", "San Francisco", "Austin"];
    cities = data.columns.slice(1).map(function(id) {
      return {
        id: id,
        values: data.map(function(d) {
          return {
            date: d.date,
            temperature: d[id]
          };
        })
      };
    });


    x.domain(d3.extent(data, function(d) {
      return d.date;
    }));
    y.domain([
      d3.min(cities, function(c) {
        return d3.min(c.values, function(d) {
          return d.temperature;
        });
      }),
      d3.max(cities, function(c) {
        return d3.max(c.values, function(d) {
          return d.temperature;
        });
      })
    ]);
    z.domain(cities.map(function(c) {
      return c.id;
    }));
    var city = g.selectAll(".city")
      .data(cities);

    city.exit().remove();

    var cityEnter = city.enter().append("g")
      .attr("class", "city");

    cityEnter.append("path")
      .attr("class", "line")
      .attr("d", function(d) {
        return line(d.values);
      })
      .style("stroke", function(d) {
        return z(d.id);
      });

    cityEnter.append("text")
      .datum(function(d) {
        return {
          id: d.id,
          value: d.values[d.values.length - 1]
        };
      })
      .attr("transform", function(d) {
        return "translate(" + x(d.value.date) + "," + y(d.value.temperature) + ")";
      })
      .attr("x", 3)
      .attr("dy", "0.35em")
      .style("font", "10px sans-serif")
      .text(function(d) {
        return d.id;
      });

    city = cityEnter.merge(city);

    city.select("path").transition().duration(1000).attr("d", function(d) {
      return line(d.values);
    });

    city.select("text").datum(function(d) {
        return {
          id: d.id,
          value: d.values[d.values.length - 1]
        };
      }).transition().duration(1000)
      .attr("transform", function(d) {
        return "translate(" + x(d.value.date) + "," + y(d.value.temperature) + ")";
      })

    svg.select(".axis--y").transition().duration(1000).call(d3.axisLeft(y))
  }
  // });

  function type(d, _, columns) {
    d.date = parseTime(d.date);
    for (var i = 1, n = columns.length, c; i < n; ++i) d[c = columns[i]] = +d[c];
    return d;
  }

</script>


Related Query

More Query from same tag