基于属性的分组布局 (igraph)

4
我正在使用R中的iGraph包来布局网络图,并且希望基于属性值对顶点坐标进行分组。与已回答的问题How to make grouped layout in igraph?类似,我的问题不同之处在于节点不必按照从社区检测算法派生的社区成员资格进行分组。
相反,我想要根据为每个顶点预先知道的属性值进行分组布局。
例如,如果每个顶点都有一个“Master.Org”属性,并且Master.Org有大约10到20个不同的值,那么如何布局图形以使所有具有相同Master.Org的顶点被分组?
谢谢!
额外细节:
实际上,两个单独的属性提供了嵌套层次的分组。
我的目标是布置一个图形对象,以便“Master.Org”和“Org.Of”值在图形上的XY坐标中彼此分组。
例如,每个节点都将属于一个“Org.Of”。而在“Master.Org”中可能会有多个“Org.Of”值。
您有什么想法吗? 谢谢!

我仍在努力,并且仍然面临挑战。基本上,因为数据是组织结构图,我已经知道社区的分割和它们所在的位置。每个节点都有一个属性来指示它们属于哪个“社区”。那么,我的挑战就是通过使用这些属性作为输入到类似于上面描述的加权机制来适当地布局图形。你有什么想法吗?谢谢! - Keith Helfrich
1个回答

11

虽然这个问题比较久远,但它是一个合理的问题,值得回答。

由于没有提供数据,因此我将生成一个任意示例。

library(igraph)
set.seed(1234)
G = erdos.renyi.game(20, 0.25)
V(G)$Group1 = sample(3,20, replace=TRUE)
plot(G, vertex.color=rainbow(3, alpha=0.4)[V(G)$Group1])

原始图表

如果什么都不做,该组将被忽略。

现在,我们需要创建一个布局,将同一组中的节点绘制在彼此附近。我们可以通过创建一个具有相同节点但在同一组中的节点之间增加额外链接的图来实现这一点。组内链接将被赋予高权重,原始链接将被赋予小权重。 这将使同一组中的节点聚类在一起。然后,我们将应用该布局来绘制原始图表,不包括额外的链接。它们只是为了获得良好的布局。

G_Grouped = G
E(G_Grouped)$weight = 1

## Add edges with high weight between all nodes in the same group
for(i in unique(V(G)$Group1)) {
    GroupV = which(V(G)$Group1 == i)
    G_Grouped = add_edges(G_Grouped, combn(GroupV, 2), attr=list(weight=5))
} 

## Now create a layout based on G_Grouped
set.seed(567)
LO = layout_with_fr(G_Grouped)

## Use the layout to plot the original graph
plot(G, vertex.color=rainbow(3, alpha=0.4)[V(G)$Group1], layout=LO)

节点按组聚类的图

如果您想进一步实现多级分组,只需添加适当权重的附加链接以连接子组。


你能否将“V(G)$Group1”转换为你的示例中的“communities对象”? - Nick
1
@Nick,是的!假设您已经在上面的示例中运行了CLG = cluster_louvain(G)。您可以完全按照我上面所做的方式操作,但每次写V(G)$ Group1时都要将其替换为CLG $ membership。它应该可以正常工作。 - G5W

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