Ich habe ein Netzwerkdiagramm (Force-directed Graph), ein Streudiagramm und eine Tabelle, die alle miteinander verbunden sind (siehe jsFiddle). Ich habe die Verbindungen funktioniert so, wie ich sie für Mouseover-Ereignisse will. Ich möchte meinen Code so ändern, dass, wenn ich über einen Knoten im Netzwerkdiagramm mouseovere, nicht nur der Mouseover-Knoten hervorgehoben wird (und seine Verbindungen im Streudiagramm und der Tabelle), sondern auch seine unmittelbaren Nachbarknoten hervorgehoben werden wie ihre Verbindungen im Streudiagramm und in der Tabelle).Mehrere Mouseover-Ereignisse auf benachbarte (verbundene) Knoten anwenden
Ich schaute auf die Informationen in Highlight selected node, its links, and its children in a D3 force directed graph für Hilfe. Irgendwo auf dem Weg (nicht genau wo), fand ich ein Beispiel für eine Funktion, die hilft, die verbundenen Knoten zu definieren, isConnected()
.
function isConnected(a, b) {
return linkedByIndex[a.index + "," + b.index] || linkedByIndex[b.index + "," + a.index] || a.index == b.index;
}
Ich möchte diese Funktion in meine Mouseover Ereignisse zu übernehmen, vielleicht mit einer if()
Aussage, so dass ich alle „Hervorhebung“ tun kann, was ich will. Aber ich bin neu in D3 und js und bin mir nicht sicher, wie ich es einrichten soll.
Unten ist das Codeschnipsel (von jsFiddle), die ich gerne ändern würde. Ich würde mich über Anregungen oder Hinweise auf andere Beispiele freuen.
var node = svg.selectAll(".node")
.data(graph.nodes)
.enter().append("g")
.attr("class", function(d) { return "node " + d.name + " " + d.location; })
.call(force.drag)
.on("mouseover", function(d) {
// I would like to insert an if statement to do all of these things to the connected nodes
// if(isConnected(d, o)) {
d3.select(this).select("circle").style("stroke-width", 6);
d3.select(this).select("circle").style("stroke", "orange");
d3.select(this).select("text").style("font", "20px sans-serif");
d3.selectAll("rect." + d.location).style("stroke-width", 6);
d3.selectAll("rect." + d.location).style("stroke", "orange");
d3.selectAll("text." + d.location).style("font", "20px sans-serif");
d3.selectAll("tr." + d.name).style("background-color", "orange");
//}
})
.on("mouseout", function(d) {
// if(isConnected(d, o)) {
d3.select(this).select("circle").style("stroke-width", 1.5);
d3.select(this).select("circle").style("stroke", "gray");
d3.select(this).select("text").style("font", "12px sans-serif");
d3.selectAll("rect." + d.location).style("stroke-width", 1.5);
d3.selectAll("rect." + d.location).style("stroke", "gray");
d3.selectAll("text." + d.location).style("font", "12px sans-serif");
d3.selectAll("tr." + d.name).style("background-color", "white");
//}
});
Dies ist hilfreich, aber es gilt nur die Nachbarhervorhebung auf das Netzwerkdiagramm. Ich möchte auch die entsprechenden Bits in der Tabelle und der Karte hervorheben. Wenn ich zum Beispiel GroupA übergebe, möchte ich, dass Jim, Sally und Tom (1) Kreise im Netzwerkdiagramm markiert haben (Ihr Code adressiert dies), (2) markierte Zeilen in der Tabelle und (3) hervorgehoben Rechtecke in der Karte. Kannst du mir mit den Teilen 2 und 3 helfen? –
Es sieht so aus, als ob Ihre Rechtecke und vielleicht Ihre Tabelle Daten nicht wie D3 assoziieren. Aber es gibt keinen Grund, warum Sie die d3-Auswahl nicht verwenden können. Der Trick wäre, das Array der Nachbarknotenindizes zu verwenden, um tatsächlich eine Liste von Knoten oder von korrekten Attributen zu erhalten, um die anderen Elemente hervorzuheben. dann sollten Sie in der Lage sein, dieselbe Logik anzuwenden. – Superboggly
Kannst du mir einen Hinweis geben, wie das geht? Ich habe versucht, \t \t \t \t 'd3.selectAll ("rect." + D.location) .filter (function (Knoten) { return nodeNeighbors.indexOf (node.index)> -1; }) .style (“ stroke "," cyan ");' aber offensichtlich hat das nicht funktioniert. –