¿Cómo puedo colorear los nodos y los bordes de una matriz de adyacencia en r?

6

Tengo dos matrices de adyacencia de una red dinámica en archivos de texto, período 1 y 2 en R (igraph). Me gustaría colorear los vértices y los bordes que son nuevos en la segunda red en verde.

Por ejemplo, la primera red podría verse así:

    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

y luego cambia a esta segunda red:

    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

El código para leer en 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 <- estructura (matriz (c (NA, 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)))

¿Cómo puedo vincular esas redes en R, para que R sepa qué vértices son nuevos?

1
  • ¿Puede convertir esto en una pregunta que podamos cortar y pegar en R para recrear sus datos? Sugerencia: utilícelo dput(thing)para hacer una representación pastable de un objeto [pequeño] ... 16/11/12 a las 12:59
7

Idealmente, la solución sería llamar graph.union, pero eso tiene algunos errores en la versión actual, así que aquí hay una solución alternativa.

Está utilizando NApara marcar los bordes faltantes, lo cual es un poco extraño, porque NAsignifica que no sabe si falta el borde o no. Reemplazaré la NAs con ceros.

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)

ingrese la descripción de la imagen aquí

4
  • Muchísimas gracias. Probé esto y funciona perfecto para los bordes, pero los vértices permanecen azules y no se vuelven negros o verdes. ¿Necesito un paquete especial? Gracias 16/11/12 a las 15:36
  • @ user1829340: ¿quieres decir que copiar y pegar mi código no funciona para ti? Eso es realmente extraño. ¿Está seguro de que sus matrices de datos tienen nombres de filas y columnas? 16/11/12 a las 19:56
  • ahora funciona, lo siento, olvidé los dimnames. Ahora tengo una tercera red (puede ver el código de arriba). ¿Cómo puedo hacer que esos bordes y vértices sean rojos en la red t2, que van a desaparecer en la red t3? 17/11/12 a las 7:24
  • Solo usa algo como E(g2)$color[! e2 %in% e3] <- "red". 17/11/12 a las 22:24