次の例に基づいて、ノード上で現在のノードに接続されていない要素がフェードアウトする力指向グラフがあります。問題は、カーソルが高速で移動し、ターゲットノードの接続の一部ではないリンクを横切る場合、交差リンクのマウスオーバーが途中でトリガーされるため、完全に不透明な状態で表示されることですが、明らかにマウスアウト機能を完了します。たとえば、これを見ることができます:
写真では、マウスが上から下に速く移動し、カーソルがHSA-MIR-424で停止しています。ターゲットノードへの接続は正しく表示されますが、カーソルがそれらを横切るとマウスオーバーがトリガーされるため、3つの追加リンクも表示されます。同じノードに対して上から下への動きをゆっくりと繰り返すか、ノードに対して下から上へ移動する場合、そのような問題は見られません(写真では、その方向に交差するリンクがないため)。
この問題をどのように回避できますか?
コードの関連部分、マウスオーバー/マウスアウトをリンクします。
.on("mouseover", function(d) {
var selection = d3.select(this);
var initialWidth = Number( selection.style("stroke-width") );
selection.transition().style("stroke-width", initialWidth + Number(4) )
.style("stroke-opacity", 1.0);
//.style("stroke", linkOverColor);
} )
.on("mouseout", function(d) {
var selection = d3.select(this);
selection.transition().style("stroke-width", getLinkStroke( selection.data()[0] ) )
.style("stroke-opacity", conf.link_def_opacity);
})
ノードのマウスオーバー/マウスアウト:
// display closest neighbors and fade others out
.on("mouseover", fade(0.10) )
// return to default view
.on("mouseout", fade(conf.node_def_opacity) );
フェージング機能:
function fade(opacity) {
return function(d) {
d3.event.stopPropagation();
var thisOpacity;
// return to default view
if( opacity === conf.node_def_opacity )
{
d3.selectAll('marker > path').transition().style("opacity", 1);
nodeGroup.transition().style("opacity", conf.node_def_opacity);
link.style("stroke-opacity", conf.link_def_opacity);
}
else // fade not-neighborhood away
{
d3.selectAll('marker > path').transition().style("opacity", 0);
// d3.selectAll('marker > path').transition().style('display', 'none');
nodeGroup.transition().style("opacity", function(o)
{
thisOpacity = isConnected(d, o) ? conf.node_def_opacity : opacity;
return thisOpacity;
});
link.style("stroke-opacity", function(o) {
return o.source === d || o.target === d ? conf.link_def_opacity : opacity;
});
}
}
}