在R /σ中用3层(三部分)可视化图形/网络

时间:2015-03-10 21:14:52

标签: r igraph

我有一个"分层"网络,有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)

1 个答案:

答案 0 :(得分:6)

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。积

您需要在每个顶点上设置图层属性。据我了解,该层由输入数据(三个表)隐式定义:

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))

enter image description here

4。同构

来自graph.isomorphic包的igraph和其他功能应该可以正常运行。

相关问题