如何使用D3.js方法重绘路径?

时间:2012-07-24 14:40:59

标签: javascript svg d3.js

我似乎无法获得.enter()和.exit以使路径正常工作。对于下面的代码,每当我尝试重绘路径时,它都会保留旧路径。

我冒昧地猜测.attr(“d”,stepline(csProg))的错误。我认为它应该更像.attr(“d”,function(d){stepline(d);})或类似的东西,但我无法让它工作。有什么建议吗?

function drawCloseChart(mysvg,mydata,cx1,cx2,cy1,cy2,oq)
{

var x = d3.scale.linear().domain([360*60, 390*60]).range([cx1, cx2]), 
    y = d3.scale.linear().domain([0,oq]).range([cy1,cy2]),
    z = d3.scale.category10();


var targetg = mysvg.append("svg:g");

    //code to draw x-axis
    //code to draw y-axis

var stepline = d3.svg.line()
    .x(function(d) { return x(d.time); })
    .y(function(d) { return y(d.val); })
    .interpolate("step-after");

var chartData = [];
chartData.redraw = function()
{


    var cpg = cprog.selectAll("path").data(csProg);
    cpg.enter()
        .append("path")
        .attr("d",stepline(csProg))
        .attr("fill","none")
        .attr("stroke-width","2")
        .attr("stroke","black");

    cpg.exit().remove();        

}
chartData.redraw();
return chartData;
}

稍后在代码中我会调用(或者这个效果):

setInterval(function(){updateDate(); chartData.redraw();},1000)

但是,旧路径不会被删除。

编辑:这是一个JSFiddle与我看到的问题。 http://jsfiddle.net/namit101/k8kUZ/26/

2 个答案:

答案 0 :(得分:8)

enterexit仅分别针对新添加的数据或仅删除的数据进行调用。因此,除非您的数据已更改,否则每次调用enter时都不会执行exitredraw,然后,只会针对新添加的数据或仅删除数据调用它。

对于您的示例,您需要为数据创建唯一标识符,以便D3知道要删除哪些路径以及要添加哪些路径。除了data变量之外,还可以通过将函数传递给mydata方法来完成此操作。

var cpg = cprog.selectAll("path").data(mydata, function(d) {
    return d.time + "-" + d.value; 
});

以下是更新的JSFiddle

答案 1 :(得分:5)

如果您在理解何时使用enter()exit()时遇到问题,请阅读Thinking with Joins。还有一个关于Path Transitions的好教程也可能对你有所帮助。如果不发布完整的代码,就很难推荐更多代码。