在D3力导向图中选择性地删除节点标签

时间:2014-02-09 14:40:20

标签: graph d3.js force-layout

整体背景:我在维基空间的页面之间有一个交叉引用的数据库,并希望逐步增加链接的可视化。

我有工作代码,可以在鼠标悬停时显示标签簇。但是当你离开时,我想保留某些关键标签(例如集群的中心),而不是隐藏所有标签。

我分叉了一个现有的例子并且大致正常工作。

enter image description here

用于删除所有标签的代码:

i = j = 0;
if (!bo) { //bo=False - from mouseout
    //labels.select('text.label').remove();
        labels.filter(function(o) {
        return !(o.name in clicked_names);
        })
        .text(function(o) { return ""; });
        j++;
}

代码试图留下一些标签,工作:

labels.forEach(function(o) {
    if (!(d.name in clicked_names)) {
        d.text.label.remove();
    }

我知道我根本就没有去玩d3模型...... THX

1 个答案:

答案 0 :(得分:0)

问题归结为您使用in来搜索数组中的名称。 Javascript in关键字搜索对象键而非对象值。对于数组,键是索引值。因此,测试(d.name in clicked_names)将始终返回false。

尝试

i = j = 0;
    if (!bo) { //bo=False - from mouseout
        //labels.select('text.label').remove();
         labels.filter(function(o) {
            return (clicked_names.indexOf(o.name) < 0);
            })
            .text(function(o) { return ""; });
            j++;

    }

如果数组中没有元素与参数相等(通过三等于标准),则array .indexOf(object)方法返回-1。或者,如果您尝试支持IE8(我假设没有,因为您使用的是SVG),您可以使用.some(function)测试。

顺便说一句,删除标签并将其文本内容设置为空字符串之间存在差异。使用哪一个取决于您是否要稍后再次显示文本。无论哪种方式,只要确保你最终没有堵塞浏览器的大量空标签。