如何在igraph中为社区聚类中的边缘着色

时间:2017-01-28 17:33:50

标签: r igraph

我创建了一个图表,并使用传播标签社区检测算法来检测图中的子组。然后,我绘制了图形并使用彩虹色根据其组成员身份对顶点着色。这是我使用的代码:

g <- watts.strogatz.game(1, 100, 5, 0.05)
clp <- cluster_label_prop(g)
V(g)$community <- clp$membership
rain <- rainbow(14, alpha=.5)
V(g)$color <- rain[V(g)$community]
plot(g, vertex.size=4, vertex.label=NA)

我现在想要将与该子组颜色相同的子组成员之间的边缘着色,以便更好地突出显示组内关系。我想让两组间的关系变得灰暗。我无法解决如何做到这一点,非常感谢帮助。

谢谢

2 个答案:

答案 0 :(得分:2)

以下内容应该有效:

library(igraph)
g <- watts.strogatz.game(1, 100, 5, 0.05)
clp <- cluster_label_prop(g)
V(g)$community <- clp$membership
rain <- rainbow(14, alpha=.5)
V(g)$color <- rain[V(g)$community]

E(g)$color <- apply(as.data.frame(get.edgelist(g)), 1, 
                function(x) ifelse(V(g)$community[x[1]] == V(g)$community[x[2]], 
                                   rain[V(g)$community[x[1]]], '#00000000'))
plot(g, vertex.size=4, vertex.label=NA, edge.color=E(g)$color)

enter image description here

答案 1 :(得分:0)

使用purrr包中的map()解决方案是:

library(igraph)
library(ggraph)
library(purrr)
g <- watts.strogatz.game(1, 100, 5, 0.05)
clp <- cluster_label_prop(g)
V(g)$color <- clp$membership

a1 <- as.data.frame(get.edgelist(g))
E(g)$color <- map2_dbl(a1$V1, a1$V2, ~ {
  ifelse(
    V(g)$color[V(g)[.x]] ==
    V(g)$color[V(g)[.y]],
    V(g)$color[V(g)[.x]],
  9999) 
})

然后使用ggraph进行可视化:

ggraph(g, layout='fr') + 
geom_edge_link0(aes(color=as.factor(color)), width=0.6, alpha=0.35) + 
geom_node_point(aes(color=as.factor(color)), size=3, alpha=0.75) + 
theme_graph(base_family = 'Helvetica')

...或使社区内部边缘与其他边缘之间的区别非常明显:

ggraph(g, layout='fr') + 
geom_edge_link0(aes(filter=color!=9999 ,color=as.factor(color)), width=0.6, alpha=0.35) + 
geom_edge_link0(aes(filter=color==9999), color='grey', width=0.5, alpha=0.25) + 
geom_node_point(aes(color=as.factor(color)), size=3, alpha=0.75) + 
theme_graph(base_family = 'Helvetica')

enter image description here