为啥我的更新函数会创建一个全新的力导向图?

Posted

技术标签:

【中文标题】为啥我的更新函数会创建一个全新的力导向图?【英文标题】:Why is my update function creating an entirely new force-directed graph?为什么我的更新函数会创建一个全新的力导向图? 【发布时间】:2012-10-16 03:42:09 【问题描述】:

我正在查看该问题中提供的 this other question 和 this example,但我无法让自己的更新功能正常工作:

update = function() 
    path = svg.append("svg:g").selectAll("path")
        .data(force.links());
    path.enter().append("svg:path")
        .attr("class", "link")
        .attr("fill", "none")
        .attr("stroke", "#666")
        .attr("stroke-width",
              function(d) 
                  return (Math.floor(Math.log(d.value - min_val) / Math.log(2)) + 1) + "px"
              )
        .attr("marker-end", "url(#generic_arrow_marker)")
        .on("mouseover",
            function(d, i) 
                if(d3.select(this).attr("stroke") != "#666") 
                    mousedOut = false;
                
            )
        .on("mouseout",
            function(d, i) 
                if(d3.select(this).attr("stroke") != "#666") 
                    mousedOut = true;
                    restoreGraph();
                
            );
    path.exit().remove();
    circle = svg.append("svg:g").selectAll("circle")
        .data(force.nodes());
    circle.enter().append("svg:circle")
        .attr("r",
              function(d) 
                  return (20 + Math.floor(Math.log(d.pagerank) / Math.log(2)) * 2) + "px"
              )
        .attr("fill", "#ccc")
        .attr("stroke", "#333")
        .attr("stroke-width", "1.5px")
        .on("mouseover", // select relevant data nodes on click
            function(d, i) 
                mousedOut = false;
                d3.select(this).attr("class", "selected");
                transitions(d);
                $("span#user").text(d.name)
                $("span#pagerank").text(d.pagerank)
            )
        .on("click",
            function(d, i) 
                incoming = !incoming;
                transitions(d);
            )
        .on("mouseout",
            function(d, i) 
                mousedOut = true;
                d3.select(this).attr("class", "");
                restoreGraph();
            )
        .call(force.drag);
    circle.exit().remove();
    text = svg.append("svg:g").selectAll("g")
        .data(force.nodes());
    textEnter = text.enter().append("svg:g");
    textEnter.append("svg:text")
        .attr("x", 8)
        .attr("y", ".31em")
        .attr("class", "shadow")
        .text(function(d)  return d.name; )
    textEnter.append("svg:text")
        .attr("x", 8)
        .attr("y", ".31em")
        .text(function(d)  return d.name; )
    text.exit().remove();
    force.start();

每当我调用 update() 时,它都会创建现有 D3 图的全新副本,即使我没有进行任何更改。

关于我可能做错了什么的想法?

【问题讨论】:

【参考方案1】:

我一发布问题就想通了...

这是因为我有svg.append("svg:g") 用于pathcircletext

我想我会留下这个问题,以防它帮助其他人......

【讨论】:

以上是关于为啥我的更新函数会创建一个全新的力导向图?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的函数每次调用时都会创建一个新对象?

使用 MagicalRecord 更新 CoreData 记录会创建一个额外的空记录

从不同的项目更新 iOS 应用程序,锁定沙箱?

可以为力导向布局指定自定义力函数吗?

为啥我的决策树会创建一个实际上并未划分样本的拆分?

为啥c ++ std::hash会创建一个仿函数结构并且可以在不每次创建结构的情况下调用它