gpt4 book ai didi

javascript - 在 D3 力导向图中突出显示所选节点、其链接及其子节点

转载 作者:行者123 更新时间:2023-12-04 19:40:59 24 4
gpt4 key购买 nike

我正在研究 D3 中的力导向图。我想通过将所有其他节点和链接设置为较低的不透明度来突出显示鼠标悬停的节点、其链接及其子节点。

在这个例子中,http://jsfiddle.net/xReHA/ ,我能够淡出所有链接和节点,然后淡入连接的链接,但是,到目前为止,我还无法优雅地淡入作为当前鼠标悬停节点的子节点的连接节点。

这是代码中的关键函数:

function fade(opacity) {
return function(d, i) {
//fade all elements
svg.selectAll("circle, line").style("opacity", opacity);

var associated_links = svg.selectAll("line").filter(function(d) {
return d.source.index == i || d.target.index == i;
}).each(function(dLink, iLink) {
//unfade links and nodes connected to the current node
d3.select(this).style("opacity", 1);
//THE FOLLOWING CAUSES: Uncaught TypeError: Cannot call method 'setProperty' of undefined
d3.select(dLink.source).style("opacity", 1);
d3.select(dLink.target).style("opacity", 1);
});
};
}

当我尝试设置从 source.target 加载的元素的不透明度时,我收到了 Uncaught TypeError: Cannot call method 'setProperty' of undefined 错误。我怀疑这不是将该节点加载为 d3 对象的正确方法,但如果不再次遍历所有节点以找到与链接的目标或源匹配的节点,我找不到另一种加载它的方法。为了保持合理的性能,我不想不必要地遍历所有节点。

我以淡化来自 https://bl.ocks.org/mbostock/4062006 的链接为例:

enter image description here

但是,这并没有说明如何更改连接的子节点。

任何关于如何解决或改进这个问题的好建议都会被强烈投票 :)

最佳答案

错误是因为您选择的是数据对象(d.source 和 d.target)而不是与这些数据对象关联的 DOM 元素。

你的行突出显示工作正常,但我可能会将你的代码合并到一个迭代中,如下所示:

 link.style("opacity", function(o) {
return o.source === d || o.target === d ? 1 : opacity;
});

突出显示相邻节点比较困难,因为您需要了解每个节点的相邻节点。使用您当前的数据结构确定此信息并不那么容易,因为您拥有节点数组和链接数组。暂时忘掉 DOM,问问自己如何确定两个节点 ab 是否是邻居?

function neighboring(a, b) {
// ???
}

一种昂贵的方法是遍历所有链接并查看是否存在连接 a 和 b 的链接:

function neighboring(a, b) {
return links.some(function(d) {
return (d.source === a && d.target === b)
|| (d.source === b && d.target === a);
});
}

(假设链接是无向的。如果您只想突出前向连接的邻居,则删除 OR 的后半部分。)

如果您必须经常这样做,一种更有效的计算方法是使用 map 或矩阵,允许恒定时间查找以测试 a 和 b 是否为邻居。例如:

var linkedByIndex = {};
links.forEach(function(d) {
linkedByIndex[d.source.index + "," + d.target.index] = 1;
});

现在你可以说:

function neighboring(a, b) {
return linkedByIndex[a.index + "," + b.index];
}

因此,您现在可以遍历节点并正确更新它们的不透明度:

node.style("opacity", function(o) {
return neighboring(d, o) ? 1 : opacity;
});

(您可能还想对鼠标悬停链接本身进行特殊处理,方法是为 linkedByIndex 中的每个节点设置一个自链接,或者直接测试 d在计算样式时,或使用 !important css :hover 样式时。)

我要在您的代码中更改的最后一件事是使用 fill-opacity 和 stroke-opacity 而不是 opacity,因为它们提供更好的性能。

关于javascript - 在 D3 力导向图中突出显示所选节点、其链接及其子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16616610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com