假设我在R中有一个数据集,指示组内的个人。这是一个例子:
grp <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5)
ind <- c("A", "C", "D", "B", "C", "D", "E", "A", "D", "E", "B", "F", "E", "A", "F")
data.frame(grp, ind)
因此,数据如下所示:
grp ind
1 1 A
2 1 C
3 1 D
4 2 B
5 2 C
6 2 D
7 2 E
8 3 A
9 3 D
10 3 E
11 4 B
12 4 F
13 4 E
14 5 A
15 5 F
因此,组1由个人(A,C,D)组成,组2由个人(B,C,D,E)组成,依此类推。我想创建一个网络图,以显示个人如何相互联系。在一个组中,所有个体都通过边连接。边缘的厚度应反映两个人相互连接的频率。
带有:
pairs <- do.call(rbind, sapply(split(ind, grp), function(x) t(combn(x,2))))
我可以获得一个具有所有成对边的矩阵,可以使用
igraph
包进行绘制:library(igraph)
plot(graph.edgelist(pairs, directed=FALSE), edge.curved=FALSE)
但是,是否有一种方法可以使边缘的厚度与特定配对的发生频率成正比?
最佳答案
@hrbrmstr的解决方案构建第二个图以获取边缘权重。您还可以通过对pairs
进行操作来预先执行此操作:
# Count unique edge pairs
library(plyr)
weighted <- ddply(data.frame(pairs), .(X1, X2), count)
# Plot
library(igraph)
g <- graph.edgelist(as.matrix(weighted[,1:2]), directed=FALSE)
plot(g, edge.curved=FALSE, edge.width=weighted$freq*3)
关于r - 根据组成员资格数据创建加权图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22695409/