从图形对象获取布局

Obtain layout from a graph object

这是一个简单的问题,但我似乎找不到相关文档。我有一个图形对象,它是通过合并两个图形创建的。我想输出合并期间创建的布局函数。

a <- barabasi.game(10)
b <- barabasi.game(20)

ab <- union(a,b)

理想情况下,我想以一种将子图 (a,b) 放置在它们自己的方式中来可视化联合 "space." igraph 中是否有用于输出布局的默认函数图形对象?

对于 igraph,布局是坐标矩阵。如果你调用任何布局方法,你会得到一个矩阵:

loa <- layout.fruchterman.reingold(a)
lob <- layout.fruchterman.reingold(a)

如果您将这些矩阵分配给 layout graph 属性,igraph 将在绘图时自动使用它们,或者您可以将它们直接传递给 plot 方法:

b$layout <- loa
plot(a)
plot(b, layout = lob)

如果你对两个图进行并集,它们的布局属性,如果有的话,不会被合并,而是重命名为layout_1layout_2。如果你想把不重叠的部分分开,合并布局,我有这样的想法:

a <- barabasi.game(10)
b <- barabasi.game(20)
a$layout <- layout.norm(layout_with_fr(a), -1, 0, -1, 1) # each subgraph
b$layout <- layout.norm(layout_with_fr(b),  0, 1, -1, 1) # in their own space
V(a)$x <- a$layout[,1]
V(a)$y <- a$layout[,2]
V(b)$x <- b$layout[,1]
V(b)$y <- b$layout[,2]
V(a)$color <- 'blue'
ab <- union(a, b)
V(ab)$x <- vapply(seq(vcount(ab)),
               function(vid){
                   ifelse(is.na(V(ab)$x_1[vid]),
                       V(ab)$x_2[vid],
                       V(ab)$x_1[vid])
               }, 0.0)
V(ab)$y <- vapply(seq(vcount(ab)),
               function(vid){
                   ifelse(is.na(V(ab)$y_1[vid]),
                       V(ab)$y_2[vid],
                       V(ab)$y_1[vid])
               }, 0.0)
ab$layout <- cbind(V(ab)$x, V(ab)$y)
V(ab)$color[is.na(V(ab)$color)] <- 'yellow'
plot(ab, rescale = FALSE)

这里我创建了两个布局,一个向西缩放,另一个向坐标系的东半部分缩放。然后我合并了布局,默认情况下从 a 获取坐标,如果顶点不是 b 的一部分,则从 b 获取坐标。从 xy 坐标制作新的布局矩阵后,我用 rescale = FALSE 绘制图形,所以坐标保持不变。

注意:您可能希望合并图形而不是基于数字顶点 ID,而是基于名称。为此,创建一个 name 顶点属性,并将 byname = TRUE 参数传递给 union 方法。