3

想知道以下是否可能:

目前,我在图中有一个节点子集(图 A),它属于另一个单独且更大的图(图 B)。

在图 A 上运行布局生成算法时,我想保留与该节点子集有关的图 B 中的布局。可以是任何布局算法。

 layout.circle(graph, params)
 layout.sphere(graph, params)
 layout.fruchterman.reingold(graph, ..., dim=2, params)
 layout.kamada.kawai(graph, ..., dim=2, params)
 layout.spring(graph, ..., params)
 layout.reingold.tilford(graph, ..., params)
 layout.fruchterman.reingold.grid(graph, ..., params)
 layout.lgl(graph, ..., params)
 layout.graphopt(graph, ..., params=list())
 layout.mds(graph, dist=NULL, dim=2, options=igraph.arpack.default)
 layout.svd(graph, d=shortest.paths(graph), ...)
4

2 回答 2

2

您可以使用minxmaxxminy或的maxy参数layout.fruchterman.reingold()layout.kamada.kawai()完全修复某些顶点。这些参数指定坐标的特定于顶点的下限和/或上限。

对于要修复的顶点,将它们精确设置为要修复的值,并将其他顶点设置minx为一些小的负值(-Inf可能也可以),并设置maxx为一些大的值,(再次,也许Inf也可以) .

您可能需要使用rescale=FALSE参数 inplot.igraph()来避免重新调整第一个和第二个图形的完整布局。

编辑:

从手册:

' minx' 如果不是 ' NULL',那么它必须是一个数值向量,它为x顶点的 ' ' 坐标提供下边界。向量的长度必须与图中的顶点数匹配。

' maxx' 类似于 ' minx',但给出了上限。

例如:

g <- graph.star(10, center=1)

minx <- rep(-Inf, vcount(g))
maxx <- rep( Inf, vcount(g))
minx[1] <- 0
maxx[1] <- 0
lay <- layout.fruchterman.reingold(g, minx=minx, maxx=maxx, miny=minx, maxy=maxx)

plot(g, layout=lay)

将第一个顶点固定为 (0,0) (可以通过重新缩放来修改,以避免重新缩放,使用rescale=FALSEplot()设置绘图限制)。

在此处输入图像描述

于 2012-08-27T13:58:01.097 回答
0

igraph 中的布局定义为(节点数)乘以 2 的矩阵,其中第一列表示 x 坐标(任意比例),第二列表示 y 坐标。您可以存储任何这些函数的结果以获取此矩阵,然后layout在绘制另一个图形时将其传递给参数。

library("igraph")

# A 3-node network:
g <- graph.adjacency(matrix(1,3,3))

# Obtain a layout:
l <- layout.circle(g)

# A different 3-node network:
g2 <- graph.adjacency(matrix(0,3,3))

# Plot second network with layout based on first network:
plot(g2,layout=l)

编辑

如果你有一个图的子集,你可以简单地索引这个矩阵。例如:

# A 3-node network:
g <- graph.adjacency(matrix(1,3,3))

# Obtain a layout:
l <- layout.circle(g)

# A 2-node subset:
g2 <- graph.adjacency(matrix(1,2,2))

# Plot second network with layout based on first network:
plot(g2,layout=l[1:2,])
于 2012-08-26T10:30:18.380 回答