これにはいくつかの方法がありますが、これは今のところ私が考えることができる最も簡単な方法です。
block.lockの間には 2 つのパスがあり、等しいが反対の値を持つことに注意してください (これらは互いにソースとターゲットの両方であるため)。そのうちの 1 つがもう一方の上に正確に配置され、1 つのパスのように見えます。そのため、これら 2 つのノード間のリンクは多少ギザギザになっていますが、他のノードは滑らかです。おそらく、これを利用することができます。Assess
Create QoS Degradation Report
link--source
CSS のおよびの定義をlink--target
不透明度の値が 1 未満になるように調整すると、部分的に透明なソース リンクが部分的に透明なターゲット リンクに重なり、「新しい」別の色の外観になります。
node--both
ノードの色については、「新しい」色で新しい CSS クラスを作成し、関数でn.source
との両方n.target
が true の場合、それをノードに適用しmousovered
ます。
node
.classed("node--both", function(n) { return n.source && n.target; })
.classed("node--target", function(n) { return n.target; })
.classed("node--source", function(n) { return n.source; });
完璧ではありませんが、これを示すフィドルがあります: http://jsfiddle.net/w2rfwokx/
重要なのは、ソース リンクとターゲット リンクの色と不透明度の値を適切に選択することです (私はしませんでした)。これにより、ソース リンクとターゲット リンクとは十分に異なる新しい色が得られ、ソースまたはターゲット リンクに関係なく同じ色が得られます。ターゲット リンクは「上」です。現在のフィドル バージョンでは、アクティブなノードによって色がわずかに異なることがわかります。このスレッドまたは同様のものが役立つ場合があります。
配列を操作links
して 2 つの同一のパスを 1 つにマージし、これがソースとターゲットのリンクであることを示す属性を追加して、後で処理中にこの属性を使用することもできます。
更新:あなたのコメントには正しい考えがあります。とにかく、色のトリックはハックのようなものでした.
links
配列には、双方向インポート ノード間の 1 つのパスの 2 つの項目が含まれています。それらの 1 つを削除し、もう 1 つの属性を設定して、これが双方向のインポートであることを示しましょう。
var unique_links = links.reduce(function(p,c) {
var index=p.map(function(d,i) { if(d.source===c.target && d.target===c.source) return i;}).shift();
if(!isNaN(index)) p[index].both=true; else p.push(c);
return p;
},[]);
現在unique_links
、エッジごとに 1 つの要素しかなく、その 1 つの要素には がありboth=true
ます。both
また、属性をバンドル レイアウトに渡しましょう。
link = link
.data(bundle(unique_links))
.enter().append("path")
.each(function(d) {
d.source = d[0],
d.target = d[d.length - 1],
d.both = unique_links.filter(function(v) { if (v.source===d.source && v.target===d.target) return v.both; }).shift();
})
.attr("class", "link")
.attr("d", line);
最後のステップは、mouseovered
関数を変更して、次のように異なる色の新しい CSS クラスを設定することboth
です。
function mouseovered(d) {
node
.each(function(n) { n.target = n.source = false; });
link
.classed("link--both", function(l) { if((l.target===d || l.source===d) && l.both) return l.source.source = l.source.target = l.target.source = l.target.target = true;})
.classed("link--target", function(l) { if (l.target === d && !l.both) return l.source.source = true; })
.classed("link--source", function(l) { if (l.source === d && !l.both) return l.target.target = true; })
.filter(function(l) { return l.target === d || l.source === d; })
.each(function() { this.parentNode.appendChild(this); });
node
.classed("node--both", function(n) { return n.target && n.source; })
.classed("node--target", function(n) { return n.target; })
.classed("node--source", function(n) { return n.source; });
}
でクラスをリセットしますmouseouted
。
function mouseouted(d) {
link
.classed("link--both", false)
.classed("link--target", false)
.classed("link--source", false);
node
.classed("node--both", false)
.classed("node--target", false)
.classed("node--source", false);
}
CSS で新しいクラスを定義することを忘れないでください。
.link--both {
stroke: orange;
}
.node--both {
fill: orange;
}
完全なコードで更新されたフィドルは次のとおりです: http://jsfiddle.net/w2rfwokx/1/