tutorial teoria redes que grafos grafo analisis r igraph

teoria - igraph creando una matriz de adyacencia ponderada



redes grafos (4)

La solución de @ TWL se puede generalizar fácilmente para representar el ancho de los bordes en función de los pesos, incluidos los pesos negativos. El truco es traducir todos los pesos sumando el valor del peso más pequeño (más, opcionalmente, un desplazamiento que representa el ancho del peso mínimo). Por ejemplo:

# reproducible example: set.seed(12345) a <- matrix(runif(5*5, min=-10, max=10), ncol=5) diag(a) <- 0 # remove loops. >a [,1] [,2] [,3] [,4] [,5] [1,] 0.0000000 -6.6725643 -9.309291 -0.7501069 -0.9254385 [2,] 7.5154639 0.0000000 -6.952530 -2.2371204 -3.4649518 [3,] 5.2196466 0.1844867 0.000000 -1.9502972 9.3083065 [4,] 7.7224913 4.5541051 -9.977268 0.0000000 4.1496375 [5,] -0.8703808 9.7947388 -2.175933 9.0331751 0.0000000 # create igraph object. g <- graph.adjacency(a, mode="undirected", weighted=TRUE) plot(g) # assign edge''s width as a function of weights. E(g)$width <- E(g)$weight + min(E(g)$weight) + 1 # offset=1 plot(g)

Estoy tratando de usar el paquete igraph para dibujar un gráfico ponderado (disperso). Actualmente tengo una matriz de adyacencia, pero no puedo obtener la función graph.adjacency para reconocer los pesos de los bordes.

Considera la siguiente matriz simétrica aleatoria:

m <- read.table(row.names=1, header=TRUE, text= " A B C D E F A 0.00000000 0.0000000 0.0000000 0.0000000 0.05119703 1.3431599 B 0.00000000 0.0000000 -0.6088082 0.4016954 0.00000000 0.6132168 C 0.00000000 -0.6088082 0.0000000 0.0000000 -0.63295415 0.0000000 D 0.00000000 0.4016954 0.0000000 0.0000000 -0.29831267 0.0000000 E 0.05119703 0.0000000 -0.6329541 -0.2983127 0.00000000 0.1562458 F 1.34315990 0.6132168 0.0000000 0.0000000 0.15624584 0.0000000") m <- as.matrix(m)

Para trazar, primero debo obtener esta matriz de adyacencia en el formato igraph adecuado. Esto debería ser relativamente simple con graph.adjacency . De acuerdo con mi lectura de la documentación para graph.adjacency , debo hacer lo siguiente:

library(igraph) ig <- graph.adjacency(m, mode="undirected", weighted=TRUE)

Sin embargo, no reconoce los pesos del borde:

str(ig) # IGRAPH UNW- 6 8 -- # + attr: name (v/c), weight (e/n) # + edges (vertex names): # [1] A--E A--F B--C B--D B--F C--E D--E E--F plot(ig)

¿Cómo consigo igraph para reconocer los pesos de borde?


Los pesos están ahí, weight (e/n) significa que hay un atributo de borde llamado peso, y es numérico. Ver ?print.igraph . Pero no se trazan de forma predeterminada, debe agregarlos como edge.label.

plot(ig, edge.label=round(E(ig)$weight, 3))

Para el trazado, asegúrese de leer ?igraph.plotting .


Por mucho que me encanta igraph, he encontrado que el paquete qgraph es más fácil de trazar redes ponderadas.

Con la matriz de adyacencia, también puede usar qgraph() de la biblioteca qgraph para trazarla. Automáticamente coloreará los bordes negativos de un tono de rojo y los bordes positivos de un tono de verde.

install.packages(''qgraph'') require(qgraph) qgraph(m) qgraph(m,edge.labels=TRUE) #if you want the weights on the edges as well

qgraph está construido en igraph, pero solo hace todo por ti.


Puede extraer los pesos de borde con E(ig)$weight y asignarlos al argumento edge.width en la función de trazado:

plot(ig, edge.width=E(ig)$weight)

Vea el ?igraph.plotting [ link ] para referencia.

Además, tenga en cuenta que en este ejemplo, los pesos corresponderán al ancho de los bordes, por lo tanto, deben ser >= 0 .