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からのリンクをフェードする例を取り上げました。
ただし、接続されている子ノードを変更する方法は示されていません。
これを解決または改善する方法についての良い提案は、猛烈に賛成されます:)