gpt4 book ai didi

r - 在 R/igraph 中可视化具有 3 层(三方)的图/网络

转载 作者:行者123 更新时间:2023-12-04 12:34:52 24 4
gpt4 key购买 nike

我有一个“分层”网络,有 3 层,比如说 parent (P)、 child (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. 期限

我想你可以说它是一个三方图,但我不确定这个术语是否用于有向图。

2. 创建图表

要创建图形对象(使用 igraph 包),只需 rbind所有边缘并使用 igraph.data.frame 创建它。在绑定(bind)之前,列名必须匹配。

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 的其他功能包应该执行得很好。

关于r - 在 R/igraph 中可视化具有 3 层(三方)的图/网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28974206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com