使用igraph在R中绘制多个离散网络
问题描述:
我有一组简单的方向关系(父 - >子),我想绘制。我的数据的结构使得有许多分立的子网络。这里有一些看起来像我的假数据。使用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)
假数据中有两个截然不同的子网络,每个子网络严格来说都是父母 - 子女的谱系。我需要在同一个窗口中绘制两个谱系作为树形网络(理想情况下是相同的顶点坐标系)。我尝试过使用layout.reingold.tilford(),但我最多只能绘制其中一棵树,所有其他顶点都绘制在根顶点顶部,就像这样。
lo<-layout.reingold.tilford(graph_begats,root=1)
plot(graph_begats,layout=lo)
对任意数量的离散谱系进行此操作的任何想法?
答
所以,正如我在上面的评论中提到的,一种解决方案是分别为每个组件计算布局。这很简单,即使需要一些代码才能正确执行。以下代码适用于任意数量的组件。拓扑排序中的第一个顶点用作每个树的根节点。
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)
+0
非常感谢,Gabor。这就是它! – 2013-03-23 13:12:17
如果我能想出如何A)计算离散谱系的数量在数据集中,和B)分配给每个顶点到其谱系,我会的方式到75%解决我的问题。 – 2013-03-21 23:16:33
使用'clusters()'或'decompose.graph()'分开网络,然后分别计算每个网格的布局,然后通过移动其中一个布局矩阵来合并它们。 – 2013-03-22 01:09:44
是的! 'decompose.graph()'是我需要的。仍然在矩阵转换工作,但我到了那里。 – 2013-03-22 14:15:13