Ho un diagramma di rete (grafico orientato alla forza), uno scatterplot e una tabella tutti interconnessi (vedere jsFiddle). Ho le interconnessioni che funzionano nel modo in cui le voglio per gli eventi mouseover. Vorrei modificare il mio codice in modo che quando topo il mouse su un nodo nel diagramma di rete, non solo sia evidenziato il nodo moused-over (e le sue connessioni nello scatterplot e nella tabella), ma anche i suoi nodi adiacenti immediati (come pure come le loro connessioni nello scatterplot e nel tavolo).applicare diversi eventi mouseover a nodi vicini (connessi)
Ho cercato le informazioni in Highlight selected node, its links, and its children in a D3 force directed graph per aiuto. Da qualche parte lungo la strada (non esattamente sicuro dove) ho trovato un esempio di una funzione che aiuta a definire i nodi connessi, isConnected()
.
function isConnected(a, b) {
return linkedByIndex[a.index + "," + b.index] || linkedByIndex[b.index + "," + a.index] || a.index == b.index;
}
mi piacerebbe inserire questa funzione nei miei eventi mouseover, magari con un if()
dichiarazione, in modo che io possa fare tutti i "evidenziando" che voglio. Ma, sono nuovo a D3 e js e non sono sicuro di come impostarlo.
Di seguito è riportato lo snippet di codice (dallo jsFiddle) che desidero modificare. Apprezzerei qualsiasi suggerimento o suggerimento per altri esempi.
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");
//}
});
Ciò è utile, ma si applica solo l'evidenziazione adiacente al diagramma di rete. Voglio anche evidenziare i bit corrispondenti nella tabella e nella mappa. Quindi, ad esempio, quando topo il mouse su GroupA, voglio che Jim, Sally e Tom abbiano (1) cerchi evidenziati nel diagramma di rete (il tuo codice li indirizza), (2) righe evidenziate nella tabella e (3) evidenziate rettangoli sulla mappa. Potete aiutarmi con le parti 2 e 3? –
Sembra che i tuoi rettangoli e forse la tua tabella non associno i dati allo stesso modo di D3. Ma non vi è alcun motivo per cui non sia possibile utilizzare le selezioni d3 in ogni caso. Il trucco sarebbe utilizzare la matrice degli indici dei nodi adiacenti per ottenere effettivamente un elenco di nodi o di attributi corretti per evidenziare gli altri elementi. allora dovresti essere in grado di applicare la stessa logica. – Superboggly
Puoi darmi un suggerimento su come farlo? Ho provato \t \t \t \t 'd3.selectAll ("rect." + D.location) .filter (funzione (nodo) { ritorno nodeNeighbors.indexOf (node.index)> -1; }) .Style (" ictus "," ciano ");' ma, ovviamente, questo non ha funzionato. –