在 igraph 中绘制未连接的图

Plot unconnected graph in igraph

我有一个未连接的图表,我在 igraph

中使用 fruchterman-reingold 布局绘制
require(igraph)
er_graph <- erdos.renyi.game(100, 5/20)+erdos.renyi.game(100, 5/20)
coords<-layout.fruchterman.reingold(er_graph)
plot(er_graph,layout=coords, vertex.label=NA)

绘图示例:

结果是两个遥远的星团。 我希望减少情节中的白色区域。 有没有办法缩放坐标以减少簇之间的 space?

在其中一个布局函数中可能有一种简单的方法可以做到这一点,但您也可以在创建布局后直接更改节点坐标。如果您查看 coords,您会发现它只是一个节点坐标矩阵。您可以使用集群标签以编程方式将两个节点集群靠得更近:

require(igraph)
require(dplyr)

er_graph <- erdos.renyi.game(100, 5/20)+erdos.renyi.game(100, 5/20)

# Make layout reproducible
set.seed(40)
coords <- layout.fruchterman.reingold(er_graph)

# Original graph
plot(er_graph,layout=coords, vertex.label=NA)

将聚类靠得更近:首先,我们将聚类标签添加到坐标中,并设置一个参数 f 来表示我们要消除的聚类之间距离的分数。然后我们从每个节点中减去 f 倍该集群的平均坐标与两个集群的平均坐标之间的差异。

# Add cluster labels to coords
coords = data.frame(coords, clust=clusters(er_graph)$membership)

# Move closer by a fraction "f" of mean distance between clusters
f = 0.6

# Shift each node closer to the overall center of mass of the node
coords = coords %>% 
  mutate(X1 = ifelse(clust==1, X1 - f*(mean(X1[clust==1]) - mean(X1)), X1 - f*(mean(X1[clust==2]) - mean(X1))),
         X2 = ifelse(clust==1, X2 - f*(mean(X2[clust==1]) - mean(X2)), X2 - f*(mean(X2[clust==2]) - mean(X2))))

# Convert coords back to original matrix form
coords = as.matrix(coords[,1:2])

# Re-plot graph
plot(er_graph,layout=coords, vertex.label=NA)