在igraph中绘制未连接的图

4

我有一个未连接的图表,使用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)

示例图: 示例图

结果显示出两个远离的簇。 我希望减少绘图中的白色区域。 是否有一种方法可以缩放坐标以减少簇之间的空间?

1个回答

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)

这里输入图片描述

将聚类点靠近一起:首先,我们将聚类标签添加到坐标上,并设置参数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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接