d3 清除原先画在g标签中元素,然后重画新元素?

发布于 2022-08-28 12:11:30 字数 37 浏览 13 评论 0

d3 清除原先画在g标签中元素,然后重画新元素? 。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小清晰的声音 2022-09-04 12:11:30

d3画图代码放在render()里,检测到数据变化后,重新调用一下render,在render中使用remove()清除全部d3元素就ok了

var render = funcation (){
    var svg //你的chart
    svg.selectAll(*).remove()//直接jquery的remove()就行

   //开始绘图d3 code
}

贴个例子:
-----我用了angularJS,稍微有点不同,如果对angular不熟,直接忽视变量中的scope------

#angularJS中的$watch帮助我检测data的变化,如果data有变化,调用render(重新绘图)
scope.$watch('data', function(newData) {
    return scope.render(newData);
}, true);



#这里是把d3绘图代码放在render函数中
scope.render= function(data) {
    if (!data) return;

    var color = d3.scale.category20();

    var force = d3.layout.force()
    .charge(-200)
    .linkDitance(50)
    .size([width, height]);


    svg.selectAll(*).remove()//这里就是用来清空原先绘图的元素的

    //下面都是最普通的d3代码,跟官网上的例子差不多
force
    .nodes(data.nodes)
    .links(data.links)
    .start();


var link = svg.selectAll(".link")
    .data(data.links)
    .enter().append("line")
    .attr("class", "link")
    .style("stroke-width", function(d) { return Math.sqrt(d.value); });

var node = svg.selectAll(".node")
    .data(data.nodes)
    .enter().append("circle")
    .attr("class", "node")
    .attr("r", function(d) {return Math.sqrt(d.number*2); })
    .style("fill", function(d) { return color(d.group); })
    .call(force.drag);

    //..........................
    //..........................

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文