从R中不同颜色的两个矩阵生成网络

时间:2014-06-11 17:18:59

标签: r networking plot social-networking

我有两个矩阵m1m2如下:

m1<-matrix(sample(0:1,36,replace=TRUE),nc=6);
diag(m1)<-0
row.names(m1) <- c(paste0("X",1:6))
colnames(m1) <- c(paste0("X",1:6))

m2<-matrix(sample(0:1,36,replace=TRUE),nc=6);
diag(m2)<-0
row.names(m2) <- c(paste0("X",1:6))
colnames(m2) <- c(paste0("X",1:6))

其中值1表示相应变量之间的连接。 我可以使用像igraph这样的包轻松地为其中一个矩阵生成网络。但是,我有兴趣使用两个矩阵生成差分网络,使边缘着色。这就像是重叠两个网络,使得'green'表示m1和m2都是边缘,'blue'表示m2中但不是m1的边缘,黑色边缘表示m1中的连接但不表示m1中的连接。在R?

中是否有一些生成这种网络的命令,类似于简单重叠图的“线/点”

2 个答案:

答案 0 :(得分:0)

首先,我们从邻接矩阵创建边缘列表。我们这样做,我将它们加在一起,只有m1中的那些边的值为1,而m2中的值只有2,而两者的值都是3

m3<-m1+2*m2
el<-subset(as.data.frame(as.table({m3[lower.tri(m3)]<-0; m3})), Freq>0)
names(el)<-c("V1","V2","CON")

现在我们可以使用上面编码的值

在边缘创建图形对象和颜色
library(igraph)
gg<-graph.data.frame(el, directed=F)
plot(gg, edge.color=c("black","blue","green")[E(gg)$CON])

这将为您提供以下情节

graph with color edges based on two adjacency matrices

答案 1 :(得分:0)

library(igraph)
ml <- list(m1,m2)
gl <- lapply(ml,graph.adjacency, weighted=T)
g  <- do.call("+",gl)
cols <- c("black","blue","green")
colors <- cols[as.numeric(!is.na(E(g)$weight_1)) + 2*(!is.na(E(g)$weight_2))]
set.seed(1)    # for reproducible graph
plot(g, edge.color=colors)

您的矩阵m1m2不对称,这意味着有向图。因此,在这种情况下,图表显示m1具有从X2X4的连接,而m2具有从X4X2的连接

此方法利用了以下事实:您可以添加图表,并且结果的边缘包含两个原始图表的属性(此处为weight_1weight_2)。它还涉及权重不是0或1的可能性。