D3.js 地图:依次更改路径的颜色

Mag*_*Tun 1 maps animation d3.js

我已经制作了一张地图d3.js,现在我想依次为几个国家着色:

  • 在 1 秒时,我希望西班牙处于红色,
  • 1.5 秒时,法国应为红色(西班牙应保持红色)
  • 2 秒时,德国应为红色(西班牙和法国应保持红色)
  • 等等

到目前为止我可以一次改变所有国家的颜色。我试着做我想做的事,.transition().delay(500)但没有成功。

到目前为止,这是我的代码:

<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>
<script>
    var w = 1000;
    var h = 550;

    var svg = d3.select("body").append("svg")
    .attr("width", w)
    .attr("height", h);

    var path = d3.geoPath()
        .projection(d3.geoMercator()
        //.scale(0) 
        //.translate([200, 2100])
        );

    var countries_visited= ['Spain','France','Germany','Poland', 'Finland'] 
    d3.json(
        "https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json",
        function (error, json) {

            //draw svg lines of the boundries
            svg.append("g")
                .attr("class", "black")
                .selectAll("path")
                .data(json.features)
                .enter()
                .append("path")
                .attr("d", path)
                .attr('fill', '#e7d8ad');;

            d3.timeout(function() { 
                d3.selectAll('path')
                //.transition().delay(500)  //should color countries, one after the other
                .attr('fill', colorCountry);
            }, 500);
        }
    );

    function colorCountry(country){
        if (countries_visited.includes(country.properties.name)) {
            return '#c8b98d';
        } else {  // why do I need a else (otherwise set to black
            return '#e7d8ad';
        };

    };
</script>
</body>
Run Code Online (Sandbox Code Playgroud)

作为一个附带问题:为什么我需要一个 else 语句colorCountryfill如果我不添加,为什么国家/地区会发生变化else

And*_*eid 5

为了不削弱 Xavier 的答案,您还可以通过使用函数(而不是增量)设置延迟来避免使用更 d3 惯用方法的循环:

d3.selectAll("path")
  .filter(function(d) { return countries_visited.indexOf(d.properties.name) > -1 })
  .transition()
  .delay(function(d) { return countries_visited.indexOf(d.properties.name) * 500 + 1000; })
  .attr("fill","#c8b98d");
Run Code Online (Sandbox Code Playgroud)

这看起来像:

d3.selectAll("path")
  .filter(function(d) { return countries_visited.indexOf(d.properties.name) > -1 })
  .transition()
  .delay(function(d) { return countries_visited.indexOf(d.properties.name) * 500 + 1000; })
  .attr("fill","#c8b98d");
Run Code Online (Sandbox Code Playgroud)