微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我将如何根据节点颜色将此社交网络分成 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]))

karate network

请注意,我保存布局是为了获得所有顶点的可重复位置。但是这里还有一些值得讨论的事情:我对 rescale、xlim 和 ylim 的使用。默认情况下,igraph 将布局重新缩放到范围 [-1,1]。我们希望所有三个图形的位置都相同,因此我们使用 rescale=F 将其关闭。但是,除非您设置 xlim 和 ylim,否则 igraph 仍然 仅绘制从 -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,xlim=0.9*range(LO[,ylim=0.85*range(LO[,2]))
plot(orange,layout=LO[OV,],2]))
plot(blue,layout=LO[BV,2]))

Three networks

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。