我创建了一个图表,并使用传播标签社区检测算法来检测图中的子组。然后,我绘制了图形并使用彩虹色根据其组成员身份对顶点着色。这是我使用的代码:
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)
我现在想要将与该子组颜色相同的子组成员之间的边缘着色,以便更好地突出显示组内关系。我想让两组间的关系变得灰暗。我无法解决如何做到这一点,非常感谢帮助。
谢谢
答案 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)
答案 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')