(igraph)基于属性

时间:2016-05-22 19:31:21

标签: r igraph

我在R中使用iGraph包来布局网络图,我想根据属性值对顶点坐标进行分组。

与回答的问题How to make grouped layout in igraph?类似,我的问题不同之处在于节点不需要通过社区检测算法派生的社区成员进行分组。

相反,我想基于每个顶点预先知道的属性值来布局组。

例如,如果每个顶点都有一个属性" Master.Org",并且Master.Org有~10到~20个不同的值,那么我如何布置图形以使所有顶点都在相同的Master.Org被分组?

谢谢!

其他详细信息

实际上,两个独立的属性提供了嵌套的分组级别。

我的目标是布置一个图形对象,使得" Master.Org"和" Org.Of"值在图表的XY坐标中组合在一起。

例如,每个节点都属于" Org.Of"。而且可以有多个" Org.Of" " Master.Org"。

中的值

想法? 谢谢!

1 个答案:

答案 0 :(得分:4)

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

未提供任何数据,因此我将生成一个任意示例。

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])

Original Graph

不执行任何操作,将忽略该组。

现在,我们需要创建一个布局以绘制节点 在同一组中并拢。我们可以通过创建 具有相同节点但在其他节点之间具有其他链接的图 同一组中的节点。组内链接将被给出 权重较高,则原始链接的权重较小。 这将群集同一组中的节点。然后,我们将 布局以绘制原始图,而无需额外的链接。 他们只是为了获得良好的布局。

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)

Graph with nodes clustered by group

如果您想超出此范围以具有多个级别的分组,只需添加具有适当权重的其他链接即可连接子组。