我有一个"分层"网络,有3层,让我们说父母(P),孩子(C),孙子(G)。边缘总是朝向年轻一代(专利 - >儿童,儿童 - >孙子或父母 - >孙子)。同一代中的顶点之间没有边。 该图由3个边列表(P_C,C_G,P_C)表示。下面给出一个简短的例子。
1)这种图形/网络的正确术语是什么?三方图?因此,我认为这是一个特殊情况,因为缺乏反向连接。
2)如何在R(igraph)中将其表示为图形对象?
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)
答案 0 :(得分:6)
我认为你可以说它是一个三方图,但我不确定该术语是否用于有向图。
要创建图形对象(使用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)
您需要在每个顶点上设置图层属性。据我了解,该层由输入数据(三个表)隐式定义:
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))
来自graph.isomorphic
包的igraph
和其他功能应该可以正常运行。