从图形对象获取布局
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_1
和layout_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
获取坐标。从 x
和 y
坐标制作新的布局矩阵后,我用 rescale = FALSE
绘制图形,所以坐标保持不变。
注意:您可能希望合并图形而不是基于数字顶点 ID,而是基于名称。为此,创建一个 name
顶点属性,并将 byname = TRUE
参数传递给 union
方法。
这是一个简单的问题,但我似乎找不到相关文档。我有一个图形对象,它是通过合并两个图形创建的。我想输出合并期间创建的布局函数。
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_1
和layout_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
获取坐标。从 x
和 y
坐标制作新的布局矩阵后,我用 rescale = FALSE
绘制图形,所以坐标保持不变。
注意:您可能希望合并图形而不是基于数字顶点 ID,而是基于名称。为此,创建一个 name
顶点属性,并将 byname = TRUE
参数传递给 union
方法。