【问题标题】:Selectively removing node labels in D3 force directed diagram在 D3 力有向图中选择性地删除节点标签
【发布时间】:2014-02-09 14:40:20
【问题描述】:

总体背景:我在 wiki 空间中的页面之间有一个交叉引用数据库,并且希望链接的可视化逐渐增长。

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

我分叉了一个现有的示例,并使其大致工作。

删除所有标签的代码:

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 模型.... 谢谢

【问题讨论】:

  • 您是否尝试过在您的工作解决方案中修改过滤器功能?

标签: graph d3.js force-layout


【解决方案1】:

问题归结为您使用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) 测试。

顺便说一句,删除标签和将其文本内容设置为空字符串是有区别的。使用哪一个取决于您以后是否要再次显示文本。无论哪种方式,只要确保您的浏览器不会出现大量空标签堵塞您的浏览器。

【讨论】:

  • 额外的功劳:最终可能会重新绘制多次不会褪色的标签,使它们看起来相当凌乱。检查现有非空标签并避免绘制的最佳方法?
  • 在您的过滤函数中,this 将引用 &lt;text&gt; 元素本身,因此您可以检查它是否具有非空的 textContent 属性,因此不需要包含在过滤器中:function(o) { return ( (this.textContent) &amp;&amp; (clicked_names.indexOf(o.name) &lt; 0 ) ); })。按该顺序指定两个过滤器还可以确保您只检查 clicked names 数组中当前具有文本内容的标签,这样也会更快。
猜你喜欢
  • 2019-04-23
  • 2012-11-02
  • 1970-01-01
  • 2016-08-31
  • 2012-09-11
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多