我(通过SBM)在R中的igraph
包中创建了一个模拟网络:
library(igraph)
pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5),
directed = FALSE, loops = FALSE)
图g
的邻接矩阵确定节点1-5被视为一组,而节点6-10被视为另一组。
> as_adj(g)
[1,] . 1 . 1 . . . . . .
[2,] 1 . 1 1 . . . . . .
[3,] . 1 . 1 1 . . . . .
[4,] 1 1 1 . 1 . . . . .
[5,] . . 1 1 . . . . . .
[6,] . . . . . . 1 1 . 1
[7,] . . . . . 1 . 1 1 1
[8,] . . . . . 1 1 . 1 .
[9,] . . . . . . 1 1 . 1
[10,] . . . . . 1 1 . 1 .
但是我的sample_sbm
调用生成的igraph对象不包含组成员身份作为顶点属性。
> g
IGRAPH 8750fb0 U--- 10 15 -- Stochastic block-model
+ attr: name (g/c), loops (g/l)
+ edges from 8750fb0:
[1] 1-- 2 2-- 3 1-- 4 2-- 4 3-- 4 3-- 5 4-- 5 6-- 7 6-- 8 7-- 8 7-- 9 8-- 9 6--10 7--10 9--10
如何添加此信息以进行绘图和分析?
答案 0 :(得分:1)
如果您的采样图包含两个没有共享边的不同成分(如您提供的示例),则可以使用components()$membership
获取组成员身份并将其分配给节点属性:
library(igraph)
set.seed(1234)
pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5),
directed = FALSE, loops = FALSE)
V(g)$group <- components(g)$membership
plot(g, vertex.color = V(g)$group)
这仅起作用,因为您提供的首选项矩阵会创建两个不同的组件。如果块之间存在边,则图中显然只有一个分量。在这种情况下,您可以使用cluster_*()
函数之一:
set.seed(1234)
pr_mat <- cbind(c(0.5,0.1), c(0.1, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5),
directed = FALSE, loops = FALSE)
V(g)$group <- cluster_louvain(g)$membership
plot(g, vertex.color = V(g)$group)
由reprex package(v0.3.0)于2020-04-14创建