我正在研究 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);
});
};
}
Uncaught TypeError: Cannot call method 'setProperty' of undefined
当我尝试在从 source.target 加载的元素上设置不透明度时出现错误。我怀疑这不是将该节点加载为 d3 对象的正确方法,但是如果不再次遍历所有节点以找到与链接的目标或源匹配的节点,我就找不到另一种加载它的方法。为了保持性能合理,我不想过多地迭代所有节点。
我以淡化来自http://mbostock.github.com/d3/ex/chord.html的链接为例:
但是,这并没有显示如何更改连接的子节点。
任何关于如何解决或改进这个问题的好建议都将受到热烈的支持:)