2012-11-16 4 views
6

Ich habe zwei Adjazenzmatrizen eines dynamischen Netzwerks in Textdateien, Periode 1 und 2 in R (igraph). Ich möchte die Scheitelpunkte und Kanten, die im zweiten Netzwerk neu sind, grün färben.Wie kann ich Knoten und Kanten aus einer Adjazenzmatrix in r färben?

Zum Beispiel das erste Netzwerk könnte wie folgt aussehen:

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 

und Änderungen dann an diesem zweiten Netz:

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 

Der Code in R zu lesen:

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 < - Struktur (Matrix (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), nwr = 5, ncol = 5, byrow = TRUE), dimnames = Liste (c (1,3,4,6,10), c (1,3,4,6,10)))

Wie kann ich diese Netzwerke in R verknüpfen, so dass R weiß, welche Scheitelpunkte neu sind?

+0

Können Sie dies in Frage stellen wir in R Ausschneiden und Einfügen können Ihre Daten neu erstellen? Tipp: Verwenden Sie 'dput (thing)', um eine verarbeitbare Darstellung eines [kleinen] Objekts zu erstellen ... – Spacedman

Antwort

6

Idealerweise wäre die Lösung, graph.union zu rufen, aber das hat einige Bugs in der aktuellen Version, also hier ist eine Umgehungslösung.

Sie verwenden NA, um fehlende Kanten zu markieren, was ein bisschen seltsam ist, weil NA bedeutet, dass Sie nicht wissen, ob die Kante fehlt oder nicht. Ich werde nur die NA s durch Nullen ersetzen.

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

Vielen Dank. Ich habe das versucht und es funktioniert perfekt für die Kanten, aber die Ecken bleiben blau und werden nicht schwarz oder grün. Brauche ich ein spezielles Paket? Danke – user1829340

+0

@ user1829340: meinst du kopieren und einfügen mein Code funktioniert nicht für dich? Das ist wirklich seltsam. Sind Sie sicher, dass Ihre Datenmatrizen Spalten- und Zeilennamen haben? –

+0

Jetzt funktioniert es, es tut mir leid, dass ich die Dimnamen vergessen habe. Jetzt habe ich ein drittes Netzwerk (Sie können den Code oben sehen). Wie kann ich diese Kanten und Vertices im Netzwerk t2 rot machen, die im Netzwerk t3 verschwinden werden? – user1829340