更新圆弧半径并在d3.js中设置动画效果

问题描述:

我从csv文件的地图上绘制了n个圆,并且我想更新2年容量时间内圆的半径。我的CSV文件的格式是:更新圆弧半径并在d3.js中设置动画效果

ID,纬度,经度,CapaYr1,CapaYr2

1,38.957,-122.642,94261,288839.2857

2,40.718,-122.42,3690993.143 3799364.714。

下面是我的代码:

g.selectAll("circle") 
       .data(result) 
       .enter() 
       .append("circle") 
       .attr("r", 0) 
       .attr('cx', function(d) { 
        return projection([d.Longitude, d.Latitude])[0]; 
       }) 
       .attr('cy', function(d) { 
        return projection([d.Longitude, d.Latitude])[1]; 
       }) 
       .attr('r', function(d){ 

        var hd = d3.keys(d); 
        var radDataSet = []; 


        for (var i = hd.length - 1; i >= 0; i--) { 
         if((hd[i] === "ID") || (hd[i] === "Latitude") || (hd[i] === "Longitude")){ 
         }else{ 
          radDataSet.push(Math.round(Math.sqrt((d[hd[i]]/30000)))); 
         } 
        } 

        radDataSet.forEach(function(d, i) { 
          g.selectAll("circle").transition().duration(2000).delay(i * 1000) 
          .attr("r", d); 
        }); 

       }); 

所以radDataSet阵列上面的代码有CapaYr1和CapaYr2值。 所有圆的半径都在更新,但所有的圆都有相同的radSet值。那么我怎么能这样做,即每个圆形转换具有不同的值,取决于csv文件中每行的计算radDataSet值。

radSet每行的值是[3,2]和[11,11]。其更新圈半径与[11,11]。

这里是我的小提琴 - >https://jsfiddle.net/7zumngdq/72/

这里是我的做法(我希望这是你试图解决这一问题),虽然你可能需要两个以上的数据值,为它,因为我用的线性工作规模。让我来解释:

首先我创建了一个包含您的数据(我只是不喜欢用斜杠键:S)新的数据结构

var parsed = ca2.map(function(d, i) { 
    return { 
    firstYear: +d['2000/01/31'], 
    secondYear: +d['2000/02/29'], 
    id: d['ID'], 
    lat: +d['Latitude'], 
    lng: +d['Longitude'] 
    }; 
}); 
// Pushing a new value in order to have at least one circle that 
// will change radius 
parsed.push({ 
    firstYear: 2678933, 
    secondYear: 80000000, 
    id: 'DOVAL', 
    lat: 35.2931129, 
    lng: -119.465589 
}) 

允许设置一个规模采取的护理半径尺寸:

var max = d3.max(parsed, function(d) { 
    return d.firstYear 
}); 
var min = d3.min(parsed, function(d) { 
    return d.firstYear 
}); 
var linearScale = d3.scale.linear() 
    .domain([min, max]) 
    // If we just had two values all our circles would end up being the smallest 
    // and largest values of the range defined below 
    .range([5, 25]); 

现在,让我们添加的圆圈:

var circles_first = g.selectAll(".circle-year") 
    .data(parsed) 
    .enter() 
    .append("circle") 
    .attr('class', 'circle-year') 
    .attr("r", 0) 
    .attr('cx', function(d) { 
    return projection([d.lng, d.lat])[0]; 
    }) 
    .attr('cy', function(d) { 
    return projection([d.lng, d.lat])[1]; 
    }); 

制作动画的第一咋AR值

g.selectAll(".circle-year") 
    .transition().duration(2000).delay(1000) 
    .attr('fill', 'red') 
    .attr('r', function(d) { 
    return linearScale(d.firstYear); 
    }); 

最后制作动画,第二年价值

setTimeout(function() { 
    var maxS = d3.max(parsed, function(d) { 
    return d.secondYear 
    }); 
    var minS = d3.min(parsed, function(d) { 
    return d.secondYear 
    }); 
    linearScale.domain([minS, maxS]); 
    g.selectAll(".circle-year") 
    .transition().duration(2000).delay(1000) 
    .attr('fill', 'green') 
    .attr('r', function(d) { 
     return linearScale(d.secondYear); 
    }); 
}, 8000) 

工作的jsfiddle:https://jsfiddle.net/e693hrdL/

更新:

这里有一个更新的版本应该工作,唯一的问题是你的数据在你的'SHA'数据元素中有一个巨大的斜率,因此数据变化很小。

d3.csv('./ca.csv', function(ca2) { 
    console.log('ca2', ca2); 
    var parsed = ca2.map(function(d, i) { 
    var dates = d3.keys(d).filter(function(key) { // get all date keys 
     if (key === 'ID' || key === 'Latitude' || key === 'Longitude') { 
     return false; 
     } 
     return true; 
    }); 
    var dateValues = dates.map(function(date) { // Add them as an array 
     // if (d.ID === 'SHA') { 
     // return +d[date] - 2000000; 
     // } 
     return +d[date]; 
    }); 
    return { 
     dates: dateValues, 
     id: d['ID'], 
     lat: +d['Latitude'], 
     lng: +d['Longitude'] 
    }; 
    }); 
    console.log(parsed); 
    var circles_first = g.selectAll(".circle-year") 
    .data(parsed) 
    .enter() 
    .append("circle") 
    .attr('class', 'circle-year') 
    .attr("r", 0) 
    .attr('cx', function(d) { 
     return projection([d.lng, d.lat])[0]; 
    }) 
    .attr('cy', function(d) { 
     return projection([d.lng, d.lat])[1]; 
    }); 

    parsed[0].dates.forEach(function(d, i) { // call function based on index! 
    setTimeout(function() { 
     changeRadius(i); 
    }, i * 500); 
    }) 
    var linearScale = d3.scale.linear() 
    .range([0, 25]); 

    function changeRadius(index) { 
    var maxS = d3.max(parsed, function(d) { 
     return d.dates[index]; 
    }); 
    var minS = d3.min(parsed, function(d) { 
     return d.dates[index]; 
    }); 
    console.log(minS, maxS) 
    linearScale.domain([minS, maxS]); 
    g.selectAll(".circle-year") 
     .attr('fill', function(d) { 
     return 
     }) 
     .attr('r', function(d) { 
     return linearScale(d.dates[index]); 
     }); 
    } 
}); 

工作plnkr:https://plnkr.co/edit/6GH2VWwtUp5DHOeqrKDj?p=preview