2016-12-07 3 views
2

グラフの視覚化を4段階、すなわち異なる時点で作成したいと考えています。私の頂点(ノード)の位置は、常に(全グラフの位置を使用する)にしてください。私が望むのは、R igraphグラフからいくつかの頂点を削除することだけです。問題と思われるのは、頂点の名前が変わるということです。igraph:レイアウトから頂点を削除する

# 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") 

私はここで解決策を見つけることは本当にうれしいです。たぶん、上記のようにはるかにエレガントな解決策もあります。ありがとう!

答えて

3

何らかの理由で頂点を動かしていた削除を使用する代わりに(グラフを完全にオーバーレイできず、ラベルにも耐えられない)、induced_subgraphを使用する方が良いです。私はなぜこれが事実ではないのですが、うまくいくようです。 emiliman5の答え@

# 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

上のスポットです。しかし、私はわずかに異なる解決策と元の問題を示したいと思います。

locs[-as.numeric(removals1),]頂点c("12","2","9","11","4")を除去されず、c("12","2","9","11","4")

は比較:

> 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" 

へ:ノード5の座標が異なっていること

> 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" 

お知らせ。 x座標及びサブセット後に試合をY座標かどうかを確認:

> 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 
induced_subgraph

溶液に代わるものとして、例えば、頂点IDのインデックスによってlocs行列のサブセット:

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

ラインwhich(as_ids(V(g)) %in% removals1)は、指定された頂点の行インデックスを取得:

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

頂点が「9」は、行2の頂点「2」である行9、EでありますTC第グラフの

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") 
関連する問題