使用 igraph (R) 根据节点类型将社交网络拆分为 2
Splitting a social network into 2 based on node type with igraph (R)
我如何根据节点颜色将这个社交网络分成 2 个?
我已经有了包含节点信息的数据集,但我不确定如何使用 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]))
我如何根据节点颜色将这个社交网络分成 2 个?
我已经有了包含节点信息的数据集,但我不确定如何使用 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]))