2016-12-07 8 views
2

Ich möchte eine Visualisierung eines Graphen in 4 Schritten erstellen, d. H. Zu verschiedenen Zeitpunkten. Die Positionen meiner Scheitelpunkte (Knoten) sollten immer gleich bleiben (verwenden Sie die Positionen der gesamten Grafik). Alles was ich will, ist, einige Scheitelpunkte aus dem Graphgraphen zu entfernen. Was scheint ein Problem zu sein, ist, dass die Scheitel Namen ändern.igraph: Scheitelpunkte aus dem Layout entfernen

# Erdos 
par(mfrow=c(1,3)) 
g <- erdos.renyi.game(20, 1/20) 
locs <- layout.fruchterman.reingold(g) 
V(g)$name <- V(g) 
# In the original file, vector names look like this (not "1,2,3,4...): 
V(g)$name <- as.vector(c(8,9,3,5,13,6,7,1,2,18,11,12,16,14,15,4,17,10,20,19)) 
V(g)$name 

plot(g, 
    layout=locs, 
    main="Original") 

# Remove a few vertices 
removals1 <- c("12","2","9","11","4") 
g2 <- delete.vertices(g,removals1) 
plot(g2, 
    layout=locs[-as.numeric(removals1),], 
    main="Removals") 

# Remove some more 
removals2 <- c("15","14","7","8","5","19","10") 
g3 <- delete.vertices(g2,removals2) 
plot(g3, 
    layout=locs[-as.numeric(c(removals1,removals2)),], 
    main="More Removals") 

Ich wäre wirklich glücklich, hier eine Lösung zu finden. Vielleicht gibt es auch eine viel elegantere Lösung als die obige. Vielen Dank!

Antwort

3

Anstatt die Löschung zu verwenden, die irgendwie die Scheitelpunkte bewegte (ich konnte die Grafik nicht einmal vollständig überlagern, Etiketten nicht aushalten), ist es besser, induced_subgraph zu verwenden. Ich weiß nicht, warum das so ist, aber es scheint zu funktionieren.

# Erdos 
g <- erdos.renyi.game(20, 1/20) 
locs <- layout.fruchterman.reingold(g) 
V(g)$name <- V(g) 
# In the original file, vector names look like this (not "1,2,3,4...): 
V(g)$name <- as.vector(c(8,9,3,5,13,6,7,1,2,18,11,12,16,14,15,4,17,10,20,19)) 
V(g)$name 

par(mfrow=c(1,3)) 
plot(g, 
    layout=locs, 
    main="Original") 

# Remove a few vertices 
removals1 <- c("12","2","9","11","4") 
g2 <- induced_subgraph(g, V(g)[-as.numeric(removals1)]) 
plot(g2, 
    layout=locs[-as.numeric(removals1),], 
    main="Removals") 

# Remove some more 
removals2 <- c("15","14","7","8","5","19","10") 
g3 <- induced_subgraph(g, V(g)[-as.numeric(c(removals1, removals2))]) 
plot(g3, 
    layout=locs[-as.numeric(c(removals1,removals2)),], 
    main="More Removals") 

enter image description here

1

@ Antwort emiliman5 das ist genau das Richtige; Ich möchte jedoch eine etwas andere Lösung und das Problem mit dem Original zeigen.

Die Linie locs[-as.numeric(removals1),] ist das Entfernen nicht Eckenc("12","2","9","11","4"), sondern Reihenc("12","2","9","11","4").

vergleichen:

> head(cbind(as_ids(V(g)),locs)) 
    [,1] [,2]    [,3]    
[1,] "8" "42.1520624498397" "29.0822309512088" 
[2,] "9" "42.9864581422991" "28.6882159221222" 
[3,] "3" "42.9653898313169" "30.9232356041607" 
[4,] "5" "46.6704380162041" "29.7404624492056" 
[5,] "13" "47.4190242396939" "28.5469829852443" 
[6,] "6" "46.6173689817953" "25.6916967155951" 

An:

> head(cbind(as_ids(V(g2)),locs[-as.numeric(removals1),])) 
    [,1] [,2]    [,3]    
[1,] "8" "42.1520624498397" "29.0822309512088" 
[2,] "3" "42.9653898313169" "30.9232356041607" 
[3,] "5" "47.4190242396939" "28.5469829852443" 
[4,] "13" "46.6173689817953" "25.6916967155951" 
[5,] "6" "44.3293887668239" "30.6957434444784" 
[6,] "7" "47.4947062707832" "27.0391131188028" 

Beachten Sie, dass die Koordinaten für den Knoten 5 unterschiedlich sind. Prüfen, ob die X-Koordinaten und Y-Koordinaten Spiel nach subsetting:

> r1 <- cbind(as_ids(V(g)),locs) 
> r2 <-cbind(as_ids(V(g2)),locs[-as.numeric(removals1),]) 
> r1[match(r2[,1],r1[,1]),2] == r2[,2] 
[1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE 
> r1[match(r2[,1],r1[,1]),3] == r2[,3] 
[1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE 

Als Alternative zu der induced_subgraph Lösung Teilmenge der locs Matrix durch den Index der Eckenkennungen als solche:

plot(g2, 
    layout=(locs[-which(as_ids(V(g)) %in% removals1),]), 
    main="Removals") 

die Linie which(as_ids(V(g)) %in% removals1) erhält den Zeilenindex der spezifizierten Scheiteln:

> which(as_ids(V(g)) %in% removals1) 
[1] 2 9 11 12 16 

Vertex "9" in Zeile 2, Vertex "2" in Zeile 9, e tc

Für das dritte Diagramm.

removals2 <- c("15","14","7","8","5","19","10") 
g3 <- delete.vertices(g2,removals2) 
plot(g3, 
    layout=locs[-locs[-which(as_ids(V(g)) %in% c(removals1, removals2)),], 
    main="More Removals") 
Verwandte Themen