我有一个未连接的图,我用 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)
情节示例:
结果是两个遥远的集群。
我希望减少我的情节中的白色区域。
有没有办法缩放坐标以减少集群之间的空间?
最佳答案
在其中一个布局函数中可能有一种简单的方法可以做到这一点,但您也可以在创建布局后直接更改节点坐标。如果你看 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)
关于r - 在 igraph 中绘制未连接的图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38564676/