简体   繁体   English

向折线图d3中的不同折线添加过渡

[英]Adding transition to different lines in a line chart d3

I have a line chart with two lines called in this way 我有一个折线图,其中有两条折线以这种方式调用

svg.append("path")
               .attr("class","line")
               .attr("d",line1(data))
               .style("stroke","blue");

          svg.append("path")
               .attr("id",'tag2')
               .attr("d",line2(data))
               .style("stroke","red");

and I want to add the same transition to both of the lines,the transition is the following 我想在两行中添加相同的过渡,过渡如下

transition().duration(2500).attrTween("d",pathTween);
           function pathTween() {
                var interpolate = d3.scale.quantile()
                                    .domain([0,1])
                                    .range(d3.range(1, data.length + 1));
                return function(t) {
                    return line(data.slice(0, interpolate(t)));
                };
            }

in practice this one has the effect of drawing the line on the chart,how can i call it to draw both of the lines? 实际上,这具有在图表上绘制线条的效果,我怎么称呼它可以绘制两条线条? thanks! 谢谢!

Finally I've done it! 终于我做到了!

http://bl.ocks.org/abm-adnan/raw/cb1ece4b962ac3770325/ http://bl.ocks.org/abm-adnan/raw/cb1ece4b962ac3770325/

http://bl.ocks.org/abm-adnan/cb1ece4b962ac3770325 http://bl.ocks.org/abm-adnan/cb1ece4b962ac3770325

https://gist.github.com/abm-adnan/cb1ece4b962ac3770325 https://gist.github.com/abm-adnan/cb1ece4b962ac3770325

My modifications are here: 我的修改在这里:

graphmen = svg.append("path")
    .attr("class", "line")
    .attr("id", 'tag1')
    //.attr("d", line1(data))
    .style("stroke", "blue");

/* svg.append("text").text("Men").attr("transform",function(d){
    "translate("+xScale(d.anno)+","+yScale(d.uomo)+")";
}) ; */
graphmen.transition().duration(2000).attrTween("d",pathTween1);
function pathTween1() {
    var interpolate = d3.scale.quantile()
        .domain([0, 1])
        .range(d3.range(1, data.length + 1));
    return function(t) {
        return line1(data.slice(0, interpolate(t)));
    };
}


graphwomen = svg.append("path")
    .attr("class", "line")
    .attr("id", 'tag2')
   // .attr("d", line2(data))
    .style("stroke", "red");

graphwomen.transition().duration(2000).attrTween("d",pathTween2);
function pathTween2() {
    var interpolate = d3.scale.quantile()
        .domain([0, 1])
        .range(d3.range(1, data.length + 1));
    return function(t) {
        return line2(data.slice(0, interpolate(t)));
    };
}

Solution is to use a custom tween function that knows how to interpolate point: 解决方案是使用自定义补间函数,该函数知道如何对点进行插值:

Code

 <script src="https://d3js.org/d3.v3.min.js"></script> <script> var svg = d3.select('body') .append('svg') .attr({ "width": 700, "height": 500, }); var array = [ [100, 100], [150, 150], [200, 100], [250, 150], [300, 100], [350, 150] ]; var line = d3.svg.line(); line.interpolate("monotone"); Draw_(); setInterval(function(){ d3.select('svg').html(''); Draw_(); },2500) function Draw_(){ var path_ = svg.append('path') .attr({ "transform": "translate(0,0)" }) .style({ "stroke": "steelblue", "stroke-width": 5, "fill": "none" }) path_ .transition() .duration(2000) .attrTween("d", function(d) { return lineTween.call(this, array) }) } function lineTween(b) { var num = array.length; var arr_ = []; for(var i = 0; i <= num; i++) { arr_.push(1 / num * i) } return function(t) { var i = 0 while(arr_[i] < t) { i++; } var new_arr = interpolateArrays(i, t) function interpolateArrays(index, time, array) { index--; if(!array) array = b; var fixed_arr = array.slice(0, index); var current_arr = array.slice(index, index + 2); var line_interpolate = d3.interpolate([current_arr[0], current_arr[0]], current_arr); var r = arr_.slice(index, index + 2) var scale = d3.scale.linear() .domain(r) .range([0, 1]); var slice_arr = line_interpolate(scale(t)); return d3.merge([fixed_arr, slice_arr]) } return line(new_arr) } } </script> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM