我有一个“分层”的网络,有三个层次,比如说父母(P),孩子(C),孙子(G)。边缘总是指向年轻一代(专利->孩子->孙子或父母->孙辈)。在同一代中,顶点之间没有边。该图由3个边列表(P_C、C_G、P_C)表示。给出了一个简短的例子。
1)这种图形/网络的恰当术语是什么?三方图?因此,我认为这是一个特殊的情况,因为缺乏反向连接。
2)如何将其表示为R中的图对象?
3)我能否用一种描绘“层”的方式来绘制这个图,每组的所有顶点(P,C,GC)都在相同的x坐标上对齐,从左边的P到中间的C,以及在严格的位置上的GC?
( 4)考虑到数据的分层性质,能否检验具有这种结构的图之间的同构关系。(我知道对于正则图,它将是graph.isomorphic()函数)。
edge_P_C <- read.table(text="P C
A B
A C", header=T)
edge_C_G <- read.table(text="C G
B D
B E
C F", header=T)
edge_P_G <- read.table(text="P G
A G", header=T)
发布于 2015-03-10 16:49:40
1.任期
我想你可以说它是一个三方图,但我不确定这个词是否用于有向图。
2.创建图形
要创建一个图形对象(带有igraph ),只需对所有边缘进行rbind
,并使用igraph.data.frame创建它。绑定前,列名必须匹配。
all_edges <- do.call(rbind,
lapply( list(edge_C_G, edge_P_C, edge_P_G), function(x) setNames(x, c("1","2")) )
)
g1 <- graph.data.frame(d = all_edges, directed = TRUE)
3.阴谋
您需要在每个顶点上设置layer属性。据我理解,该层是由输入数据(三个表)隐式定义的:
v_layers_df <- unique( rbind(
expand.grid( ID = edge_P_C$P, Layer = 1),
expand.grid( ID = edge_P_G$P, Layer = 1),
expand.grid( ID = edge_P_C$C, Layer = 2),
expand.grid( ID = edge_C_G$C, Layer = 2),
expand.grid( ID = edge_C_G$G, Layer = 3),
expand.grid( ID = edge_P_G$G, Layer = 3)
))
v_layers <- setNames( v_layers_df$Layer, v_layers_df$ID)
V(g1)$layer <- v_layers[V(g1)$name]
对于顶点上的layer属性,您可以在自己的布局函数中使用它(修改后的Sugiyama):
layout.k_partite <- function(g) {
l <- layout.sugiyama(g)$layout[,2:1]
l[,1] <- V(g1)$layer
l[,2] <- - l[,2] + 1 + max(l[,2])
l
}
并以这种方式使用:
plot(g1, layout = layout.k_partite(g1))
4.同构
graph.isomorphic
和来自igraph
包的其他函数应该执行得很好。
https://stackoverflow.com/questions/28974206
复制相似问题