Mam diagram sieciowy (wykres ukierunkowany na siłę), wykres rozrzutu i tabelę, które są ze sobą połączone (patrz jsFiddle). Połączenia międzysieciowe działają tak, jak chcę, aby były widoczne po najechaniu myszką. Chciałbym zmodyfikować mój kod tak, aby po najechaniu myszką na węzeł na diagramie sieciowym podświetlony był nie tylko węzeł moused-over (i jego połączenia na wykresie rozrzutu i tabeli), ale także jego sąsiednie węzły są również podświetlone (jak również jako ich połączenia w scatterplot i table).Zastosuj kilka zdarzeń mouseover do sąsiednich (połączonych) węzłów.
Spojrzałem na informacje w Highlight selected node, its links, and its children in a D3 force directed graph o pomoc. Gdzieś po drodze (nie do końca pewny gdzie) znalazłem przykład funkcji, która pomaga zdefiniować podłączone węzły, isConnected()
.
function isConnected(a, b) {
return linkedByIndex[a.index + "," + b.index] || linkedByIndex[b.index + "," + a.index] || a.index == b.index;
}
Chciałbym włączyć tę funkcję do moich imprez mouseover, być może za pomocą instrukcji if()
, tak, że mogę zrobić wszystko z „podkreślając” że chcę. Ale jestem nowy w D3 i js i nie jestem pewien, jak to skonfigurować.
Poniżej znajduje się fragment kodu (z jsFiddle), które chciałbym zmienić. Byłbym wdzięczny za wszelkie sugestie lub wskazówki do innych przykładów.
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");
//}
});
Jest to pomocne, ale dotyczy tylko podświetlenia sąsiada na diagramie sieci. Chcę również podświetlić odpowiednie bity w tabeli i na mapie. Tak więc, na przykład, gdy kliknę na Grupę A, chcę, aby Jim, Sally i Tom (1) wyróżnili kręgi na diagramie sieciowym (Twój kod adresy to), (2) podświetlone wiersze w tabeli i (3) wyróżnione prostokąty na mapie. Czy możesz mi pomóc z częściami 2 i 3? –
Wygląda jak twoje prostokąty i może twój stół nie kojarzy danych w taki sam sposób jak D3. Ale nie ma powodu, aby i tak nie można było wybrać opcji d3. Sztuką byłoby użycie tablicy indeksów węzła sąsiada, aby uzyskać listę węzłów lub poprawnych atrybutów, aby podświetlić inne elementy. wtedy powinieneś być w stanie zastosować tę samą logikę. – Superboggly
Czy możesz dać mi wskazówkę, jak to zrobić? I próbuje \t \t \t \t 'd3.selectAll ("rect". + D.location) .filter (funkcja (node) { powrotu nodeNeighbors.indexOf (node.index)> 1; }) .style (” stroke "," cyan ");' ale, oczywiście, to nie zadziałało. –