d3.js 如何处理重复出现的svg,我可以使用“mouseover”和“mouseout”添加和删除子svg吗?

bmp9r5qi  于 2022-11-12  发布在  SEO
关注(0)|答案(1)|浏览(227)
'''      
         #Parent svg
         svg.append('g')
            .selectAll("dot")
            .data(storage)
            .join("circle")
            .attr("cx", function (d) { return x(d.x); })
            .attr("cy", function (d) { return y(d.y); })
            .attr("r", .5)
            .style("fill", "green")
            .on("mouseover", function (e, d) {
                d3.select(this).transition()
                   .duration(200)
                div.style("left", (e.pageX) + "px")
                    .style("top", (e.pageY - 28) + "px");
                console.log(e, d);
                div.transition()
                    .duration(500)
                    .style("opacity", 0);
                div.transition()
                    .duration(200)
                    .style("opacity", .9);
                div.html(
                    'X, Y: ' + d.x + ", "+ d.y +
                    "<br>Pin: " + d.pinName + 
                    "<br>Net: " + d.netName);

                   s_data = storage.filter(a => a.netName ===d.netName);

                #Child svg
                svg.append('g')
                   .selectAll("dot")
                   .data(s_data)
                   .join("circle")
                   .attr("cx", function (d) { return x(d.x); })
                   .attr("cy", function (d) { return y(d.y); })
                   .attr("r", .5)
                   .style("fill", "red")

            })

            .on('mouseout', function(d,i){
                d3.select(this).transition()
                    .duration('200')
                    .style('fill', 'green');
            })

'''
最初,当我将鼠标悬停在任何一个点上时,所有的点都是绿色的,具有公共netName的点集将突出显示,在此之后,我无法返回正常状态,即,我希望所有的点再次变为绿色,以便我可以突出显示其他点并检查那里的分组。

sy5wg1nm

sy5wg1nm1#

请看下面的例子:https://codepen.io/ccasenove/pen/RwyzZrV
我在每个点上都有一个唯一的id键和一个由一些点共享的netId属性。如果在将数据绑定到一个d3选择时指定一个键函数,那么就可以获得一个具有相同netId的点的子选择,如下所示:

const _data = data.filter(da => da.netId == d.netId);
svg.selectAll("circle")
  .data(_data, d => d.id)
  .style("fill", "red")

函数d3 data将返回更新选择,即已经存在于过滤数据中的点。因此,您可以在mouseovermouseout函数中更改此更新选择的颜色。

相关问题