Il mio obiettivo è utilizzare il layout di forza d3 per visualizzare due reti diverse che condividono gli stessi nodi. Ad esempio, tra quattro persone, è possibile definire un social network e una rete di genealogia; i nodi sarebbero uguali (persone) ma i collegamenti (relazioni) potrebbero essere diversi. Nonostante la creazione di due layout di forza separati, due tele svg separate e cercando di definire variabili separate, i nodi condividono le informazioni posizionali x e y. Ecco un esempio minimo, in cui trascinare i nodi su una rete cambia le loro posizioni nelle altre reti: http://amath.colorado.edu/student/larremore/nodesSharingPositiond3Più istanze di layout di forza d3 sulla stessa pagina
Qui di seguito, ho postato la funzione che è chiamata a creare una delle reti, e il codice per creare il l'altro è molto simile, ma utilizza nomi di variabili diversi in tutte le istanze. Il codice commentato per la creazione di entrambe le reti può essere trovato in http://amath.colorado.edu/student/larremore/nodesSharingPositiond3/lib/minimal.js e lo script utilizzato per definire le variabili può essere trovato in /driver/minimalScript.js < - Non ho abbastanza reputazione per collegarlo direttamente. Mie scuse!
Da qualche parte nel modo in cui funziona d3.force, le informazioni sulla posizione sono globali o vengono selezionate globalmente o qualcosa del genere. Qualcuno potrebbe far luce su questo? Sono interessato sia a una soluzione per mantenere separate le informazioni posizionali sia a capire come d3.force gestisce e aggiorna i calcoli delle posizioni.
function makeYNet() {
// This populates the YactiveLinks variable with the proper YLinks. The goal is to be able to only display links whose value is above some threshold.
for (var i=0; i<YLinks.length; i++) {
if (YLinks[i].link2 > thr) {
YactiveLinks.push(YLinks[i]);
}
}
// Add nodes and links to forceY
forceY
.nodes(YNodes)
.links(YactiveLinks);
// Draw lines
var Ylink = svgY.selectAll("line.link")
.data(YactiveLinks)
.enter()
.append("line")
.attr("class", "link")
.style("stroke-width", 2.0);
// Draw nodes
var Ynode = svgY.selectAll("circle.node")
.data(YNodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", radius)
.attr("high",0)
.attr("id", function(d,i) {
return ("idy" + i);
})
.style("fill", function(d) { return color(d.group1); })
.call(forceY.drag)
;
// Define tick
forceY.on("tick", function() {
Ylink
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
Ynode.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
// Start 'er up
forceY.start();
}
Sto provando a fare la stessa cosa: sincronizzare le posizioni dei nodi di due layout di forza sulla stessa pagina. Ho due layout di forza che funzionano grazie alla risposta di Alex Reynolds. Tuttavia, non capisco dove impostare i ganci per la sincronizzazione della posizione.Dal momento che i collegamenti all'approccio di DBLaremore non funzionano più, qualcuno ha un suggerimento da dove iniziare o forse collega ad un altro esempio? – tty56