5

描画したい方向関係(親->子)の単純なセットがあります。私のデータは、多くの個別のサブネットワークが存在するように構成されています。これが私のように見える偽のデータです。

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)

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

4

1 に答える 1

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)

プロット

于 2013-03-23T01:34:09.460 に答える