2013-03-21 9 views
5

私は描画したい単純な方向関係(parent-> child)を持っています。私のデータは、多くの個別のサブネットワークが存在するように構成されています。私のような偽のデータがあります。igraphを使ってRに複数の離散ネットワークを描画する

require(igraph) 
parents<-c("A","A","C","C","F","F","H","I") 
children<-c("B","C","D","E","G","H","I","J") 
begats<-data.frame(parents=parents,children=children) 
graph_begats<-graph.data.frame(begats) 
plot(graph_begats) 

偽データには2つの異なるサブネットワークがあり、それぞれ厳密に親子系統です。私は両方の系統を同じウィンドウ(理想的には同じ頂点座標系)にツリーネットワークとして描画する必要があります。私はlayout.reingold.tilford()を使ってみましたが、せいぜい私が描くことができるのはツリーの1つで、他のすべての頂点がルート頂点の上にプロットしています。

lo<-layout.reingold.tilford(graph_begats,root=1) 
plot(graph_begats,layout=lo) 

任意の数の離散系統に対してこれを行うためのアイデアはありますか?

+0

I a)はデータセット内の離散的な系列の数を計算し、B)その系統の各頂点を割り当てる方法を見つけ出すことができれば、私は道の75%であろう私の問題の解決策。 –

+1

'clusters()'や 'decompose.graph()'を使ってネットワークを分割し、それぞれのレイアウトを別々に計算した後、レイアウトマトリックスの1つをシフトしてマージします。 –

+0

はい! 'decompose.graph()'が必要です。まだ行列のシフトに取り組んでいますが、私はそこに着いています。 –

答えて

6

上記のように、1つの解決策は、各コンポーネントごとにレイアウトを個別に計算することです。かなり簡単です。適切に行うにはいくつかのコードが必要です。以下のコードは、任意の数のコンポーネントに対して機能するはずです。トポロジカルな順序付けの最初の頂点は、各ツリーのルートノードとして使用されます。

require(igraph) 

## Some data 
parents <- c("A", "A", "C", "C", "F", "F", "H", "I") 
children <- c("B", "C", "D", "E", "G", "H", "I", "J") 
begats <- data.frame(parents=parents, children=children) 
graph_begats <- graph.data.frame(begats) 

## Decompose the graph, individual layouts 
comp <- decompose.graph(graph_begats) 
roots <- sapply(lapply(comp, topological.sort), head, n=1) 
coords <- mapply(FUN=layout.reingold.tilford, comp, 
       root=roots, SIMPLIFY=FALSE) 

## Put the graphs side by side, roots on the top 
width <- sapply(coords, function(x) { r <- range(x[, 1]); r[2] - r[1] }) 
gap <- 0.5 
shift <- c(0, cumsum(width[-length(width)] + gap)) 
ncoords <- mapply(FUN=function(mat, shift) { 
    mat[,1] <- mat[,1] - min(mat[,1]) + shift 
    mat[,2] <- mat[,2] - max(mat[,2]) 
    mat 
}, coords, shift, SIMPLIFY=FALSE) 

## Put together the coordinates for the original graph, 
## based on the names of the vertices 
lay <- matrix(0, ncol=2, nrow=vcount(graph_begats)) 
for (i in seq_along(comp)) { 
    lay[match(V(comp[[i]])$name, V(graph_begats)$name),] <- ncoords[[i]] 
} 

## Plot everything 
par(mar=c(0,0,0,0)) 
plot(graph_begats, layout=lay) 

plot

+0

ありがとう、Gabor。これはまさにそれです! –

関連する問題