在点击事件中访问D3 SVG对象

6

我正在处理一个气泡图,并且已经将“点击事件”绑定到每个圆圈上。当单击一个圆圈时,气泡图将被替换为一张表示更详细信息的新图表。

以下是代码的一部分:

svg.selectAll("circle")
               .data(dataset)
               .enter()
               .append("circle")
               .attr("cx", function(d) {
                    return scaleX(d[2]);
               })
               .attr("cy", function(d) {
                    return scaleY(100 - d[1]);
               })
               .attr("r", function(d) {
                    return d[1];
               })
               .attr("fill", "#4eb157")
               .attr("stroke", "#00c4d4")
               .attr("stroke-width", function(d) {

                    return d[1]*(1-d[2]/100)*1.5;

               })
               .on("click", function ()
                                    {


                                       svg.selectAll("circle")
                                       .data(new_dataset)
                                       .enter()
                                       .append("circle")
                                       .attr("cx", function(d) {
                                            return scaleX(d[2]);
                                       })
                                       .attr("cy", function(d) {
                                            return scaleY(100 - d[1]);
                                       })
                                       .attr("r", function(d) {
                                            return d[1];
                                       })
                                       .attr("fill", "#4eb157")
                                       .attr("stroke", "#00c4d4")
                                       .attr("stroke-width", function(d) {

                                            return d[1]*(1-d[2]/100)*1.5;

                                        });             


                                    svg.selectAll("text")
                                       .data(new_dataset)
                                       .enter()
                                       .append("text")
                                       .text(function(d) {
                                            return d[0];
                                       })
                                       .attr("x", function(d) {
                                            return scaleX(d[2]);
                                       })
                                       .attr("y", function(d) {
                                            return scaleY(100 - d[1]);
                                       })
                                       .attr("font-family", "sans-serif")
                                       .attr("font-size", "11px")
                                       .attr("fill", "red");
                                    });

当我点击圆形时,整个图形消失了,但没有显示新的图形。我发现在执行单击函数期间,svg对象已经从其初始状态改变,特别是一些属性(如baseURI、clientHeight、clientWidth等)不再设置,即使在最初创建svg对象时也是如此。以下是我创建svg对象的代码:
var svg = d3.select("body").append("svg")
                    .attr("width", w)
                    .attr("height", h);

我的问题是为什么新图形没有出现?这是因为svg对象的属性已经改变了吗?为了使新图形成功可视化,我应该在点击函数中做出哪些改变?
谢谢!
1个回答

4
问题在于在 onclick 事件中,您选择了 svg 元素下的所有圆形,并将它们与 new_dataset 进行连接。您可能想要选择另一组圆形元素,并将 new_dataset 加入到这组圆形中。一种方法是在 svg 下创建两个组,一个用于原始集合,另一个用于 new_dataset 的圆形,另一种解决方案是为不同组的圆形分配不同的类,并使用类缩小每个选择范围。
在以下链接中,您可以找到有关连接机制的更清晰的解释:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接