在igraph中绘制未连接的图形

时间:2016-07-25 09:56:18

标签: r plot igraph

我在fruchterman-reingold

中使用igraph布局绘制了一张未连接的图表
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)

情节示例: plot example

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

1 个答案:

答案 0 :(得分:2)

在其中一个布局函数中可能有一种简单的方法可以执行此操作,但您也可以在创建布局后直接更改节点坐标。如果你看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)

enter image description here

将聚类移近一致:首先,我们将聚类标签添加到坐标中,并设置参数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)

enter image description here