这是一个简单的问题,但我似乎无法找到它的文档。我有一个图形对象,它是通过两个图形的并集创建的。我想输出在合并期间创建的布局功能。
a <- barabasi.game(10)
b <- barabasi.game(20)
ab <- union(a,b)
理想情况下,我希望以一种将子图(a,b)放在他们自己的空间中的方式来想象联合。&#34; igraph
中是否有默认函数用于输出图形对象的布局?
答案 0 :(得分:2)
对于igraph,布局是坐标矩阵。如果你调用任何布局方法,你会得到一个矩阵:
var docs = new LinkedList<HtmlDocument>();
int tlimit = 20;
var tasks = new Task<HtmlDocument>[tlimit];
for(int i = 0; i < tlimit; ++i)
{
tasks[i] = Task<HtmlDocument>.Factory.StartNew(() => BoardScanner.GetBoardPage(i));
}
/// ???
如果将这些矩阵分配给loa <- layout.fruchterman.reingold(a)
lob <- layout.fruchterman.reingold(a)
图形属性,igraph将在绘图时自动使用它们,或者您可以直接将它们传递给绘图方法:
layout
如果您使用两个图形的并集,则它们的布局属性(如果有)不会合并,而是重命名为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
绘制了图表,因此坐标保持不变。
注意:您可能希望合并图形而不是基于数字顶点ID,而是按名称合并。为此,请创建rescale = FALSE
顶点属性,并将name
参数传递给byname = TRUE
方法。