2012-11-16 19 views
6

Ho due matrici di adiacenza di una rete dinamica in file di testo, periodo 1 e 2 in R (igraph). Mi piacerebbe colorare in verde i vertici e i bordi che sono nuovi nella seconda rete.Come posso colorare nodi e bordi da una matrice di adiacenza in r?

Ad esempio, la prima rete potrebbe apparire come segue:

1 3 6 10 11 
1 NA NA NA NA NA 

3 NA NA NA NA NA 

6 NA NA NA 8.695652174 13.04347826 

10 NA NA 2.586206897 NA 3.448275862 

11 NA NA NA 2.919708029 NA 

e modifiche poi a questa seconda rete:

1 2 3 6 10 
1 NA NA NA NA NA 

2 NA NA NA NA NA 

3 NA NA NA NA NA 

6 NA NA NA 12.32091691 8.022922636 

10 NA NA 7.228915663 NA NA 

Il codice per leggere in R:

t1 <- structure(matrix(c(NA,NA,NA,NA,NA, 
         NA,NA,NA,NA,NA, 
         NA,NA,NA,8.695652174,13.04347826, 
         NA,NA,2.586206897,NA,3.448275862, 
         NA,NA,NA,2.919708029,NA),nrow=5, ncol=5, byrow=TRUE), 
       dimnames=list(c(1,3,6,10,11), c(1,3,6,10,11))) 

t2 <- structure(matrix(c(NA,NA,NA,NA,NA, 
         NA,NA,NA,NA,NA, 
         NA,NA,NA,NA,NA, 
         NA,NA,12.32091691,8.022922636,NA, 
         NA,NA,7.228915663,NA,NA),nrow=5, ncol=5, byrow=TRUE), 
       dimnames=list(c(1,2,3,6,10), c(1,2,3,6,10))) 

t3 < - struttura (matrice (c (NA, NA, NA, NA, NA, NA, NA , 7.2289, NA, NA, NA, 10.4798, NA, NA, NA, NA, NA, 8.1364, NA, 3.8762, NA, NA, NA, NA, NA), nrow = 5, ncol = 5, byrow = TRUE), dimnames = elenco (c (1,3,4,6,10), c (1,3,4,6,10)))

Come posso collegare tali reti in R, quindi che R sa quali vertici sono nuovi?

+0

si può fare questo in una domanda possiamo tagliare e incollare nel R per ricreare i tuoi dati? Suggerimento: usa 'dput (cosa)' per fare una rappresentazione pastable di un [piccolo] oggetto ... – Spacedman

risposta

6

Idealmente la soluzione sarebbe chiamare graph.union, ma questo ha alcuni bug nella versione corrente, quindi ecco una soluzione alternativa.

Si sta utilizzando NA per contrassegnare i bordi mancanti, che è un po 'strano, perché NA significa che non si sa se il bordo è mancante o meno. Sostituirò semplicemente gli NA s con zero.

t1[is.na(t1)] <- 0 
t2[is.na(t2)] <- 0 

g1 <- graph.adjacency(t1, weighted=TRUE) 
g2 <- graph.adjacency(t2, weighted=TRUE) 

## Vertices are easy 
V(g2)$color <- ifelse(V(g2)$name %in% V(g1)$name, "black", "darkgreen") 

## Edges are a bit trickier 
el1 <- apply(get.edgelist(g1), 1, paste, collapse="-") 
el2 <- apply(get.edgelist(g2), 1, paste, collapse="-") 
E(g2)$color <- ifelse(el2 %in% el1, "black", "green") 

plot(g2, vertex.label.color="white", vertex.label=V(g2)$name) 

enter image description here

+0

Grazie mille. Ho provato questo e funziona perfettamente per i bordi, ma i vertici rimangono blu e non diventano neri o verdi. Ho bisogno di un pacchetto speciale? Grazie – user1829340

+0

@ user1829340: vuoi dire copiare e incollare il mio codice non funziona per te? È davvero strano Sei sicuro che le tue matrici di dati abbiano nomi di colonne e di righe? –

+0

ora funziona, mi dispiace ho dimenticato i dimnames. Ora ho una terza rete (puoi vedere il codice sopra). Come posso rendere quei bordi e vertici rossi nella rete t2, che spariranno nella rete t3? – user1829340

Problemi correlati