1. Term
我想你可以说这是一个三方图,但我不确定这个术语是否用于有向图。
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. Plot
您需要在每个顶点上设置图层属性。据我了解,该层是由输入数据(三个表)隐式定义的:
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]
通过顶点上的图层属性,您可以在自己的布局函数中使用它(修改后的 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. 同构
The graph.isomorphic
和其他功能igraph
包应该表现得很好。