使用 igraph (R) 根据节点类型将社交网络拆分为 2

Splitting a social network into 2 based on node type with igraph (R)

我如何根据节点颜色将这个社交网络分成 2 个?

https://imgur.com/a/SLOhqQk

我已经有了包含节点信息的数据集,但我不确定如何使用 igraph 拆分它们。

代码:

# Weighted 
V(network)[attrib_info$sex =="M"]$color="tomato2"
V(network)[attrib_info$sex =="F"]$color="lightblue2"
plot.igraph(network,
            vertex.size=10,
            vertex.label.cex=0.0000000000000000001,
            edge.color="black",
            edge.width=E(network)$weight*20)

为此,您需要控制布局。这并不难做到。由于您不提供数据,我将使用标准 karate 数据集进行说明。我设置随机种子以获得可重现的结果。然后,生成布局。空手道网络带有一个 color 顶点属性,我们想根据这个属性分割网络。

library(igraph)
library(igraphdata)     ## for karate
data(karate)

set.seed(2021)
LO = scale(layout_nicely(karate))
plot(karate, layout=LO, rescale=F, vertex.size=20,
    xlim=0.8*range(LO[,1]), ylim=0.8*range(LO[,2]))

请注意,我保存布局是为了获得所有顶点的可重现位置。但是这里还有一些值得讨论的事情:我对 rescale、xlim 和 ylim 的使用。默认情况下,igraph 将布局重新缩放到范围 [-1,1]。我们希望所有三个图形的位置相同,因此我们使用 rescale=F 将其关闭。但是,除非您设置 xlim 和 ylim,否则 igraph still 仅绘制从 -1 到 1 的范围,因此我选择一个范围来显示所有节点,而图表周围没有过多的空白。

现在我们要按颜色划分两个子网。

OV = which(V(karate)$color == 1)
BV = which(V(karate)$color == 2)
orange = induced_subgraph(karate, OV)
blue   = induced_subgraph(karate, BV)

最后,我们想要将所有三个绘制在同一个图上,节点位于相同的位置。基本上,这就是为三个网络中的每一个重复上述绘图语句,只为每个网络选择布局矩阵的相关部分。我使用 par 在一个屏幕上制作三个图表。 (当然,我调整了屏幕大小以使其适合这些。)

par(mfrow=c(1,3), mar = c(1,2,1,2))
plot(karate, layout=LO, rescale=F, vertex.size=20,
    xlim=0.9*range(LO[,1]), ylim=0.85*range(LO[,2]))
plot(orange, layout=LO[OV, ], rescale=F, vertex.size=20,
    xlim=0.9*range(LO[,1]), ylim=0.85*range(LO[,2]))
plot(blue, layout=LO[BV, ], rescale=F, vertex.size=20,
    xlim=0.9*range(LO[,1]), ylim=0.85*range(LO[,2]))