如何在R中使用邻接矩阵对节点和边进行着色?

6

我有两个动态网络的邻接矩阵文本文件,分别为周期1和2,使用 R(igraph)进行处理。我想将第二个网络中新添加的顶点和边缘以绿色着色。

例如,第一个网络可能如下所示:

    1   3   6   10  11 
1   NA  NA  NA  NA  NA

3   NA  NA  NA  NA  NA

6   NA  NA  NA  8.695652174 13.04347826

10  NA  NA  2.586206897 NA  3.448275862

11  NA  NA  NA  2.919708029 NA

并将其更改为第二个网络:
    1   2   3   6   10
1   NA  NA  NA  NA  NA

2   NA  NA  NA  NA  NA

3   NA  NA  NA  NA  NA

6   NA  NA  NA  12.32091691 8.022922636

10  NA  NA  7.228915663 NA  NA

读取R中的代码:

t1 <- structure(matrix(c(NA,NA,NA,NA,NA, 
                         NA,NA,NA,NA,NA, 
                         NA,NA,NA,8.695652174,13.04347826, 
                         NA,NA,2.586206897,NA,3.448275862,
                         NA,NA,NA,2.919708029,NA),nrow=5, ncol=5, byrow=TRUE),
                dimnames=list(c(1,3,6,10,11), c(1,3,6,10,11)))

t2 <- structure(matrix(c(NA,NA,NA,NA,NA, 
                         NA,NA,NA,NA,NA, 
                         NA,NA,NA,NA,NA, 
                         NA,NA,12.32091691,8.022922636,NA, 
                         NA,NA,7.228915663,NA,NA),nrow=5, ncol=5, byrow=TRUE),
                dimnames=list(c(1,2,3,6,10), c(1,2,3,6,10)))

t3 <- 结构体(矩阵(c(NA,NA,NA,NA,NA, NA,NA,7.2289,NA,NA, NA,10.4798,NA,NA,NA, NA,NA,8.1364,NA,3.8762, NA,NA,NA,NA,NA),nrow=5, ncol=5, byrow=TRUE), dimnames=list(c(1,3,4,6,10), c(1,3,4,6,10)))

如何在R中将这些网络连接起来,使得R知道哪些顶点是新的?


你能否将这个转化为一个问题,以便我们可以将其剪切并粘贴到R中以重新创建您的数据?提示:使用dput(thing)来制作一个可粘贴的[小]对象表示... - Spacedman
1个回答

7

理想情况下,解决方案应该是调用 graph.union,但在当前版本中存在一些错误,因此这里提供了一个解决方法。

您使用NA来标记缺失的边,这有点奇怪,因为NA表示您不知道边是否缺失。我将用零替换NA

t1[is.na(t1)] <- 0
t2[is.na(t2)] <- 0

g1 <- graph.adjacency(t1, weighted=TRUE)
g2 <- graph.adjacency(t2, weighted=TRUE)

## Vertices are easy
V(g2)$color <- ifelse(V(g2)$name %in% V(g1)$name, "black", "darkgreen")

## Edges are a bit trickier
el1 <- apply(get.edgelist(g1), 1, paste, collapse="-")
el2 <- apply(get.edgelist(g2), 1, paste, collapse="-")
E(g2)$color <- ifelse(el2 %in% el1, "black", "green")

plot(g2, vertex.label.color="white", vertex.label=V(g2)$name)

enter image description here


非常感谢。我尝试了这个方法,对于边缘来说它很完美,但顶点仍然是蓝色的,没有变成黑色或绿色。我需要一个特殊的软件包吗?谢谢。 - user1829340
@user1829340:你的意思是复制粘贴我的代码对你不起作用?这真的很奇怪。你确定你的数据矩阵有列名和行名吗? - Gabor Csardi
现在它可以工作了,很抱歉我忘记了dimnames。现在我有第三个网络(你可以在上面看到代码)。我该如何使那些在网络t3中消失的边缘和顶点在网络t2中变成红色? - user1829340
只需使用类似于 E(g2)$color[! e2 %in% e3] <- "red" 的东西。 - Gabor Csardi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接