2016-11-19 1 views
0

これは簡単な質問ですが、ドキュメントが見つかりません。私は2つのグラフの和集合を取って作成されたグラフオブジェクトを持っています。私は、マージ中に作成されたレイアウト関数を出力したいと思います。グラフオブジェクトからレイアウトを取得する

a <- barabasi.game(10) 
b <- barabasi.game(20) 

ab <- union(a,b) 

理想的には、私は自分の中に部分グラフ(A、B)を置く方法で組合を視覚化したい「スペース」。グラフオブジェクトのレイアウトを出力するデフォルト関数はigraphですか?

+0

いくつかの注意点:#1必要なパッケージ( 'library(igraph)')#2を追加し、再現可能にするためにいくつかのランダムアクションの前にシードを設定してください(例えば 'set.seed(1)')。 #3 Afaikには、マージ(?)中に作成された "レイアウト機能"がありません。レイアウトを作成することができます。 'layout.auto(ab)'や 'layout.auto(a)'を使って、ノード/頂点の座標を与えます。 – lukeA

答えて

2

igraphでは、レイアウトは座標の行列です。あなたが任意のレイアウトメソッドを呼び出す場合、行列を得る:

loa <- layout.fruchterman.reingold(a) 
lob <- layout.fruchterman.reingold(a) 

あなたはlayoutグラフ属性にこれらの行列を割り当てた場合、IGRAPHがプロット時に自動的にそれらを使用するか、直接プロットメソッドに渡すことができます。

b$layout <- loa 
plot(a) 
plot(b, layout = lob) 

彼らが持っている場合は、そのレイアウト属性を二つのグラフの和集合を取る場合は、マージされますが、layout_1layout_2に改名されることはありません。私は、座標系の東半分に他の2つのレイアウト、1が西にスケールを、作成した。ここ

a <- barabasi.game(10) 
b <- barabasi.game(20) 
a$layout <- layout.norm(layout_with_fr(a), -1, 0, -1, 1) # each subgraph 
b$layout <- layout.norm(layout_with_fr(b), 0, 1, -1, 1) # in their own space 
V(a)$x <- a$layout[,1] 
V(a)$y <- a$layout[,2] 
V(b)$x <- b$layout[,1] 
V(b)$y <- b$layout[,2] 
V(a)$color <- 'blue' 
ab <- union(a, b) 
V(ab)$x <- vapply(seq(vcount(ab)), 
       function(vid){ 
        ifelse(is.na(V(ab)$x_1[vid]), 
         V(ab)$x_2[vid], 
         V(ab)$x_1[vid]) 
       }, 0.0) 
V(ab)$y <- vapply(seq(vcount(ab)), 
       function(vid){ 
        ifelse(is.na(V(ab)$y_1[vid]), 
         V(ab)$y_2[vid], 
         V(ab)$y_1[vid]) 
       }, 0.0) 
ab$layout <- cbind(V(ab)$x, V(ab)$y) 
V(ab)$color[is.na(V(ab)$color)] <- 'yellow' 
plot(ab, rescale = FALSE) 

:あなたが分離された非重複部分を維持し、レイアウトをマージしたい場合は、私はこのアイデアを持っています。次に、デフォルトで座標をaから、bから、bの一部でない場合は、レイアウトをマージしました。 xy座標から新しいレイアウトマトリックスを作成した後、グラフをrescale = FALSEとプロットしたので、座標は変更されません。

注:数多くの頂点IDに基づいていないグラフをマージしたい場合があります。このためには、name頂点属性を作成し、byname = TRUEパラメータをunionメソッドに渡します。

関連する問題