Redes usando igraph
Beatriz Valdez
Generalmente nuestra data, independintemente de lo que pueda contener, es una matriz, o marco, de datos. Y podemos, por tanto, emplear técnicas relacionadas con matrices para manipularla. Por ejemplo, tengo un marco de datos con información sobre algunas alianzas y tendencias polÃticas de algunos partidos polÃticos en Venezuela, consumo de alimentos y la serie del Caribe. Aplico operaciones de matrices y, posteriormente, visualizo con grafos (redes)
Preparación de la data
Obtengo la data y los paquetes que necesito
load("D:/pRedes.RData")
require(igraph)
require(xtable)
Manipulación de marcos y matrices de datos
#dimensiones
dim(coa)
## [1] 44 6
44 Filas, es decir casos, y 6 columnas, es decir variables. Cada fila o cada columna es un vector. Una fila es un vector en que se recoge toda la información de cada variable para ese caso. Cada columna es un vector que ofrece información sobre una variables para todos los casos.Puedo saber las dimensiones de ese marco, lo que me indicará el número de filas y el número de columnas del marco de datos coa
# informacion sobre el primer caso de mi matriz de datos
coa[1,]
## partido siglas fundacoion tendencia
## 1 Corrientes Revolucionarias Venezolanas CRV na Guevarismo
## ubicacion coalicion
## 1 izquierda gpp
# Este procedimiento es igual a
"["(coa, 1)
## partido
## 1 Corrientes Revolucionarias Venezolanas
## 2 Independientes por la Comunidad Nacional
## 3 Juventud Unidad en Acción Nacional con Bimba
## 4 Movimiento Electoral del Pueblo
## 5 Movimiento Tupamaro de Venezuela
## 6 Nuevo Camino Revolucionario
## 7 Partido Comunista de Venezuela
## 8 Partido Revolucionario del Trabajo
## 9 Partido Socialista Organizado en Venezuela
## 10 Partido Socialista Unido de Venezuela
## 11 Patria Para Todos
## 12 Por la Democracia Social
## 13 Redes de Respuesta de Cambios Comunitarios
## 14 Unidad Popular Venezolana
## 15 Vanguardia Bicentenaria Republicana
## 16 Acción Democrática
## 17 Alianza Bravo Pueblo
## 18 Avanzada Progresista
## 19 Bandera Roja
## 20 Convergencia
## 21 Comité de Organización PolÃtico Electoral Independiente
## 22 Cuentas Claras
## 23 Democracia Renovadora
## 24 Electores Libres
## 25 Fuerza Liberal
## 26 Gente Emergente
## 27 La Causa Radical
## 28 Movimiento al Socialismo
## 29 Movimiento de Integridad Nacional Unidad
## 30 Movimiento Ecológico de Venezuela
## 31 Movimiento Laborista
## 32 Movimiento Progresista de Venezuela
## 33 Movimiento Republicano
## 34 Moverse
## 35 Primero Justicia
## 36 Proyecto Carabobo
## 37 Proyecto Venezuela
## 38 Solidaridad Independiente
## 39 Unidad Visión Venezuela
## 40 Unidos para Venezuela
## 41 Unión Republicana Democrática
## 42 Un Nuevo Tiempo
## 43 Vanguardia Popular
## 44 Voluntad Popular
# informacion sobre las distintas siglas de los
# 44 casos, la segunda variable
coa$siglas
## [1] "CRV" "IPCN" "JUAN BIMBA" "MEP"
## [5] "MRT" "NCR" "PCV" "PRT"
## [9] "PSOEV" "PSUV" "PPT" "PODEMOS"
## [13] "REDES" "UPV" "VBR" "AD"
## [17] "ABP" "AP" "BR" "CONVERGENCIA"
## [21] "COPEI" "CC" "DR" "EL"
## [25] "FL" "GE" "LA CAUSA R" "MAS"
## [29] "MIN-UNIDAD" "MOVEV" "ML" "MPV"
## [33] "MR" "MOVERSE" "MPJ" "PROCA"
## [37] "PRVZL" "SI" "UVV" "UNPARVE"
## [41] "URD" "UNTC" "VP" "VPA"
# procedimiento equivalente al anterior
coa[[2]]
## [1] "CRV" "IPCN" "JUAN BIMBA" "MEP"
## [5] "MRT" "NCR" "PCV" "PRT"
## [9] "PSOEV" "PSUV" "PPT" "PODEMOS"
## [13] "REDES" "UPV" "VBR" "AD"
## [17] "ABP" "AP" "BR" "CONVERGENCIA"
## [21] "COPEI" "CC" "DR" "EL"
## [25] "FL" "GE" "LA CAUSA R" "MAS"
## [29] "MIN-UNIDAD" "MOVEV" "ML" "MPV"
## [33] "MR" "MOVERSE" "MPJ" "PROCA"
## [37] "PRVZL" "SI" "UVV" "UNPARVE"
## [41] "URD" "UNTC" "VP" "VPA"
Para obtener todos los atributos del marco de datos
# puedo obtener información general
attributes(coa)
## $names
## [1] "partido" "siglas" "fundacoion" "tendencia" "ubicacion"
## [6] "coalicion"
##
## $row.names
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
##
## $class
## [1] "data.frame"
# o sobre un atributo especÃfico
attr(coa, "row.names")
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
Puedo extraer información de este marco de datos, transformandola en el mismo proceso en una matriz de datos. La matriz se representa como matriz[fila, columna].
# Puedo unir dos filas y crear una nueva matriz de datos
rbind(coa[1,], coa[7,])
## partido siglas fundacoion
## 1 Corrientes Revolucionarias Venezolanas CRV na
## 7 Partido Comunista de Venezuela PCV 1931
## tendencia ubicacion coalicion
## 1 Guevarismo izquierda gpp
## 7 Marxismo-leninismo izquierda gpp
# o puedo unir dos columnas con el mismo objetivo
cbind(coa[,2], coa[,4])
## [,1] [,2]
## [1,] "CRV" "Guevarismo"
## [2,] "IPCN" "Izquierdista"
## [3,] "JUAN BIMBA" "na"
## [4,] "MEP" "Socialismo"
## [5,] "MRT" "Marxismo"
## [6,] "NCR" "Socialismo"
## [7,] "PCV" "Marxismo-leninismo"
## [8,] "PRT" "Izquierdista"
## [9,] "PSOEV" "Socialismo"
## [10,] "PSUV" "SocialismoSiglo XXI"
## [11,] "PPT" "Izquierdista"
## [12,] "PODEMOS" "Socialdemocracia"
## [13,] "REDES" "Izquierdista"
## [14,] "UPV" "Comunismo"
## [15,] "VBR" "na"
## [16,] "AD" "Socialdemocracia"
## [17,] "ABP" "Socialdemocracia"
## [18,] "AP" "Centroizquierda"
## [19,] "BR" "Marxismo-leninismo"
## [20,] "CONVERGENCIA" "Socialcristianismo"
## [21,] "COPEI" "Socialcristianismo"
## [22,] "CC" "Centro progresista"
## [23,] "DR" "Socialdemocracia"
## [24,] "EL" "Federalismo"
## [25,] "FL" "Socialdemocracia"
## [26,] "GE" "Centroizquierda"
## [27,] "LA CAUSA R" "Sindicalismo"
## [28,] "MAS" "Socialismo progresista"
## [29,] "MIN-UNIDAD" "Centro derecha"
## [30,] "MOVEV" "Ecologismo"
## [31,] "ML" "Sindicalismo"
## [32,] "MPV" "Centroizquierda"
## [33,] "MR" "Centro derecha"
## [34,] "MOVERSE" "ambientalismo"
## [35,] "MPJ" "Centro Humanismo"
## [36,] "PROCA" "Socialcristianismo"
## [37,] "PRVZL" "Socialcristianismo"
## [38,] "SI" "Humanista cristiano"
## [39,] "UVV" "Liberal"
## [40,] "UNPARVE" "Centro"
## [41,] "URD" "Nacionalismo progresista"
## [42,] "UNTC" "Socialdemocracia"
## [43,] "VP" "Izquierdista"
## [44,] "VPA" "Centro progresista"
Recordemos que si deseo que esa información se guarde para seguir operando co ella, debo darle un nombre al procedimiento. Por otra parte, estos procedimientos me guardarÃan la información como matriz (matrix) y no como marco de datos (data.frame). Esto último es muy importante porque un marco de datos puede almacenar vectores con variables de distinto tipo: numérica, caracter, ordinal, etc., en tanto que en una matriz sólo se puede guardar variables de un mismo tipo: todas numéricas, todas tipo caracter, etc.
Note que el nombre de las columnas es claro. Corresponde al nombre de las variables. Sin embargo, en este caso, las filas (row.names) no tienen un nombre discernible sino que aparece como una sucesión de número. Si no cambia el nombre de las filas por uno que tenga sentido, en la red que cree aparecerán estos números, en lugar de los nombres que seguramente pueden ofrecer mayor información.
Redes de afiliación (red de dos modos)
En este tipo de red tenemos las relaciones entre dos tipos de diferentes de nodos: personas y organizaciones, paÃses e importaciones (o cualquier otra relación comercial), etc. De un lado, en las filas, digamos, tenemos las personas, y en las columnas, los eventos. La relación entre las personas, o entre los eventos, no se establece de forma directa, sino, a través de los vÃnculos persona/evento, organización/evento.
Ejemplo 1. Consumo de alimentos en Venezuela
Desayunos según Decil/Quintil de ingreso
Tengo la data sobre el consumo de alimentos en Venezuela en el año 2005, según Deciles/Quintiels de ingreso. En primer lugar, tengo información sobre el tipo de desayuno:
print(xtable(acondesayunoing),
include.rownames = FALSE,type = "html")
Plato.principal | TOTAL | Decil1 | QI | QII | QIII | QIV | Decil10 |
---|---|---|---|---|---|---|---|
Arepa. Acomp | 48.00 | 64.80 | 56.20 | 52.50 | 46.10 | 39.10 | 35.60 |
Empanadas | 16.20 | 5.10 | 10.80 | 13.90 | 19.20 | 19.80 | 17.90 |
Pan.acomp | 14.20 | 9.80 | 11.90 | 11.80 | 13.40 | 18.70 | 22.10 |
Pastelitos | 3.70 | 1.70 | 2.60 | 3.50 | 3.70 | 4.90 | 5.90 |
Tequeños | 2.10 | 1.00 | 1.30 | 2.70 | 2.80 | 1.60 | 1.30 |
Avena | 1.90 | 1.80 | 1.80 | 1.90 | 1.90 | 1.90 | 1.40 |
Tetero | 1.80 | 3.00 | 2.70 | 2.00 | 1.40 | 1.20 | 1.00 |
Sopas.herv.cremas | 1.40 | 0.40 | 1.20 | 1.90 | 1.70 | 0.70 | 0.60 |
Galletas.acomp | 1.40 | 1.00 | 0.90 | 1.00 | 1.80 | 1.70 | 1.80 |
Bollitos.acomp | 1.30 | 1.90 | 2.10 | 1.70 | 0.80 | 0.80 | 0.70 |
Otros | 8.10 | 9.50 | 8.40 | 7.10 | 7.10 | 9.70 | 11.70 |
Quiero visualizar el tipo de vÃnculo entre el tipo de desayuno, filas, y el nivel de ingreso. Antes necesito pre-proesar la data. Necesito eliminar la columna “TOTAL”, pasar “Plato.principal” como nombre de filas:
# elimino la columna 'total'
conin<-acondesayunoing[, -c(2)]
# paso los nombres de la primera columna a nombres de filas
rownames(conin)<-conin[,1]
#elimino la primera columna
conin<-conin[,-c(1)]
Dado que tengo una matriz de incidencia, puedo emplear la funcion graph_from_incidence_matrix(), que me dará como resultado una red de dos modos. Quiero ver qué tipo de desayuno elige qué decil/quintil, por tanto, las flechas saldrán de los nodos correspondientes a las columnas
desayunoin<-graph_from_incidence_matrix(conin,
directed=TRUE, mode="in", weighted = TRUE)
Reviso la estructura
par(bg="gray15",mar=c(1,1,1,1))
plot(desayunoin,vertex.label=NA, asp=FALSE,
vertex.size=3,
vertex.color= "gray90",
vertex.frame.color= "gray90",
edge.color="gray55",
edge.arrow.size=0.6)
print(xtable(estructura(desayunoin)),
include.rownames = FALSE,type = "html")
Indicadores | valor |
---|---|
nodos | 17.00 |
aristas | 66.00 |
densidad | 0.24 |
diametro | 64.80 |
long.med.cam | 1.00 |
grado medio | 7.76 |
modularidad | -0.06 |
coefic.cluster | 0.00 |
Tenemos una red bipartida con 17 nodos y 66 aristas. Es un grafo bipartido completo, aunque los indicadores parecieran señalar algo distinto. Estos es asà porque las redes de dos modos deben evaluarse en forma distinta. Por ello sólo reporto la cantidad de nodos y las cantidad de vÃnculos.
La visualización nos devuelve una imagen poco interesante. Puedo mejorarla para que me resulte más informativa. Puedo, por ejemplo, escalar los vÃnculos, de acuerdo con su valor, para obtener el patrón visual sobre que Quintil/Decil de ingreso consume más qué tipo de desayuno, e igualmente puedo reforzar esa información con el color de esos vÃnculo: colores más claros y lÃneas más delgadas, menor valor, y lÃneas más gruesasy y oscuras, mayor valor:
nTerms <- nrow(conin)
nDocs <- ncol(conin)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)
# atributos para los vertices
V(desayunoin)$color[idx.terms] <- rgb(0.1, 0, 1, .9)
V(desayunoin)$size[idx.terms] <- 6
V(desayunoin)$color[idx.docs] <- "#228B22"
V(desayunoin)$size[idx.docs] <- 4
V(desayunoin)$frame.color[idx.terms] <- rgb(0.1, 0, 1, .5)
V(desayunoin)$frame.color[idx.docs] <- "#228B22"
V(desayunoin)$label.color[idx.docs]<-"#8B1A1A"
V(desayunoin)$label.dist<-0.6
# atributo para los vinculos
pacolores <-function(grafo){
vin<-log(E(grafo)$weight)+.4/
max(log(E(grafo)$weight)+.4)
vin2<-ifelse(vin < 0, abs(vin), vin)
vin2<-ifelse(vin2 > 1, vin2/5, vin2)
return(list(vin=vin, vin2=vin2))}
ar<-pacolores(desayunoin)
E(desayunoin)$color <- rgb(1, .5, ar$vin2/2, ar$vin2)
E(desayunoin)$width<-ar$vin
Visualizo de nuevo
plot(desayunoin)
Independientemente del nivel del ingreso, los venezolanos, en el año 2005 preferÃan desayunar con arepas, y luego con empanada o pan. La empanada era preferida por el Quintil IV, el de menor ingresos, y el Quintil III. En tanto que el pan se consume de forma más o menos uniforme en los Quinteles II-IV. Dado que los deciles no es más que la información agregada de los deciles, extraigamos la red para visualizar el grafo, sin esta información:
# elimino las columnas correspondientes a 'Decil'
conina<-conin[, -c(1,6)]
# genero el grafo
desayuno<-graph_from_incidence_matrix(conina,
directed=TRUE, mode="in", weighted = TRUE)
# extraigo elementos para mejorar la visualización
nTerms <- nrow(conina)
nDocs <- ncol(conina)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)
ar <-pacolores(desayuno)
# establezco los atributos correspondientes a los nodos
V(desayuno)$color[idx.terms] <- rgb(0.1, 0, 1, .9)
V(desayuno)$size[idx.terms] <- 6
V(desayuno)$color[idx.docs] <- "#228B22"
V(desayuno)$size[idx.docs] <- 4
V(desayuno)$frame.color[idx.terms] <- rgb(0.1, 0, 1, .5)
V(desayuno)$frame.color[idx.docs] <- "#228B22"
V(desayuno)$label.color[idx.docs]<-"#8B1A1A"
V(desayuno)$label.dist<-0.6
#Establezco atributos para las aristas
E(desayuno)$color <- rgb(1, .5, ar$vin2/2, ar$vin2)
E(desayuno)$width<-ar$vin
Visualizo de nuevo
plot(desayuno)
Alimentos según sitio de en donde se ingiere
# elimino la columna 'total'
lugar<-aconsumo[, -c(2)]
# paso los nombres de la primera columna a nombres de filas
rownames(lugar)<-lugar[,1]
#elimino la primera columna
lugar<-lugar[,-c(1)]
lugarin<-graph_from_incidence_matrix(lugar,
directed=TRUE, mode="in", weighted = TRUE)
# extraigo elementos para mejorar la visualización
nTerms <- nrow(lugar)
nDocs <- ncol(lugar)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)
ar <-pacolores(lugarin)
# establezco los atributos correspondientes a los nodos
V(lugarin)$color[idx.terms] <- rgb(178/250, 34/250,
34/250)
V(lugarin)$size[idx.terms] <- 6
V(lugarin)$color[idx.docs] <- "#228B22"
V(lugarin)$size[idx.docs] <- 4
V(lugarin)$frame.color[idx.terms] <- rgb(178/250, 34/250,
34/250)
V(lugarin)$frame.color[idx.docs] <- "#228B22"
V(lugarin)$label.color[idx.docs]<-"#8B1A1A"
V(lugarin)$label.dist<-0.6
#Establezco atributos para las aristas
E(lugarin)$arrow.width <-.50
E(lugarin)$arrow.size <-.9
E(lugarin)$color <- rgb(0/250, 139/250, 0, ar$vin2)
E(lugarin)$width<-ar$vin
plot(lugarin)
Las personas, generalmente hacen sus tres comidas en casa; el desayuno es la comida que más tienden a consumir fuera del hogar, básicaente en comedores/cantinas o en luncherÃa. Cuando se almuerza fuera del hogar, tiende a hacerse en restaurantes.
Ejemplo 2. Serie del Caribe
Sede y ganadores
print(xtable(head(serieCaribe, 8)),
include.rownames = FALSE,type = "html")
ANO. | SEDE. | campeon | MANAGER |
---|---|---|---|
1976 | Rep.Dominicana | naranjeros | Benjamin Reyes |
1986 | Venezuela | aguilas.mexicali | Benjamin Reyes |
1974 | Mexico | criollos.caguas | Bobby Wine |
2009 | Mexico | tigres.aragua | Buddy Bailey |
1953 | Cuba | cangrejeros | Buster Clarkson |
1970 | Venezuela | magallanes | Carlos Pascual |
2006 | Venezuela | leones.caracas | Carlos Subero |
1994 | Venezuela | tigres.licey | Casey Parson |
De esta información puedo obtener varias redes. Abrevio los nombres
sCaribe <-data.frame(
campeon = serieCaribe$campeon,
sede =serieCaribe$SEDE.)
sCar <-table(sCaribe)
sg1<-graph_from_incidence_matrix(sCar,
directed=TRUE, mode="in",
weighted = TRUE)
ar<-pacolores(sg1)
nTerms <- nrow(sCar)
nDocs <- ncol(sCar)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)
V(sg1)$color[idx.terms] <- "#68228B"
V(sg1)$frame.color[idx.terms] <- NA
V(sg1)$size[idx.terms] <- 6
V(sg1)$color[idx.docs] <- "#8FBC8F"
V(sg1)$frame.color[idx.docs] <-NA
V(sg1)$size[idx.docs] <- 4
V(sg1)$label.dist<-0.48
V(sg1)$label.family[idx.docs] <-"mono"
V(sg1)$label.family[idx.terms] <-"sans"
V(sg1)$label.font[idx.docs] <-2
V(sg1)$label.font[idx.terms] <-1
V(sg1)$label.color[idx.docs] <-"#8B4500"
V(sg1)$label.color[idx.terms] <-"#2F4F4F"
E(sg1)$arrow.width <-.50
E(sg1)$arrow.size <-.9
E(sg1)$color <- "#8FBC8F"
Visualizo
plot(sg1,main="Serie del Caribe, segun sede y ganadores")
Convertir redes de dos modos en redes de un modo
cm <-as.matrix(conina)
ej <-cm %*% t(cm)
g <- graph_from_adjacency_matrix(ej,
weighted=TRUE,
diag = FALSE,
mode="undirected")
ar<-pacolores(g)
# el procedimiento anterior es similar a
g1 <- graph_from_adjacency_matrix((ej+ t(ej))/2,
weighted=TRUE,
diag = FALSE,
mode="undirected")
plot(g, vertex.size=betweenness(g),
edge.width=E(g)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
La información que obtenemos al transformar la red de dos nodos en una red de un modo es semejante. Pero en este última modalidad de red podemos emplear los indicadores que ya hemos trabajado. De esta red, por la vÃa del grosor de los vÃnculos notamos que la combinación empanada-arepa-pan es la que más se emplea en los desayunos venezolanos; adicionalmente, observamos que los bollitos acompañado y en menor medida las galletas acompañadas son las combinaciones que, sin ser las más comunes, son las que están presentes entre las diferentes combinaciones. La gente, entonces, desayuna empanada y arepas, harina de maÃz, y pan, harina de trigo, o bollitos y galletas.
ar<-pacolores(g1)
plot(g1, vertex.size=betweenness(g1),
edge.width=E(g1)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
Podemos seguir varios procedimientos para simplificar la visualización de la red, y que, a su vez, nos ayudarán a centrar la atención en algunos patrones que de otra forma serÃan poco evidentes:
ej1<-ej[ ej< 100 ] <- 0
g2 <- graph_from_adjacency_matrix(ej,
weighted=TRUE,
diag = FALSE,
mode="undirected")
ar<-pacolores(g2)
plot(g2, vertex.size=betweenness(g2),
edge.width=E(g2)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
g3 <- graph_from_adjacency_matrix((ej+ t(ej))/2,
weighted=TRUE,
diag = FALSE,
mode="undirected")
ar<-pacolores(g3)
plot(g3, vertex.size=betweenness(g3),
edge.width=E(g3)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
Este procedimiento nos revela que la avena también es un un acompañante del desayuno, no figura entre los más frecuentes, pero esta detrás de cada desayuno
ej2 <-cm %*% t(cm)
g4 <- graph_from_adjacency_matrix(ej,
weighted=TRUE,
diag = FALSE,
mode="max")
g5 <- graph_from_adjacency_matrix(ej2,
weighted=TRUE,
diag = FALSE,
mode="max")
ar<-pacolores(g4)
plot(g4, vertex.size=betweenness(g4),
edge.width=E(g4)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
ar<-pacolores(g5)
plot(g5, vertex.size=betweenness(g5),
edge.width=E(g5)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
otro
nzs <- function(x) sort(x [x!=0])
all(nzs(pmax(ej,
t(ej))[upper.tri(ej)]) == sort(E(g4)$weight))
## [1] TRUE
g5 <- graph_from_adjacency_matrix(ej2,
weighted=TRUE,
diag = FALSE,
mode="max")
all(nzs(pmax(ej2,
t(ej2))[upper.tri(ej)])==sort(E(g5)$weight))
## [1] TRUE
ar<-pacolores(g4)
plot(g4, vertex.size=betweenness(g4),
edge.width=E(g4)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
ar<-pacolores(g5)
plot(g5, vertex.size=betweenness(g5),
edge.width=E(g5)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
otro
g4 <- graph_from_adjacency_matrix(ej,
weighted=TRUE,
diag = FALSE,
mode="min")
g5 <- graph_from_adjacency_matrix(ej2,
weighted=TRUE,
diag = FALSE,
mode="min")
all(nzs(pmin(ej,
t(ej))[upper.tri(ej)])==sort(E(g4)$weight))
## [1] TRUE
all(nzs(pmin(ej2,
t(ej2))[upper.tri(ej)])==sort(E(g5)$weight))
## [1] TRUE
ar<-pacolores(g4)
plot(g4, vertex.size=betweenness(g4),
edge.width=E(g4)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
ar<-pacolores(g5)
plot(g5, vertex.size=betweenness(g5),
edge.width=E(g5)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
Otro
g6 <- graph_from_adjacency_matrix(ej,
weighted=TRUE,
diag = FALSE,
mode="upper")
all(nzs(ej[upper.tri(ej)]) == sort(E(g6)$weight))
## [1] TRUE
g61 <- graph_from_adjacency_matrix(ej2,
weighted=TRUE,
diag = FALSE,
mode="upper")
all(nzs(ej2[upper.tri(ej2)]) == sort(E(g61)$weight))
## [1] TRUE
ar<-pacolores(g6)
plot(g6, vertex.size=betweenness(g6),
edge.width=E(g6)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
ar<-pacolores(g61)
plot(g61, vertex.size=betweenness(g61),
edge.width=E(g61)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
otro
g7 <- graph_from_adjacency_matrix(ej,
weighted=TRUE,
diag = FALSE,
mode="lower")
all(nzs(ej[lower.tri(ej)]) == sort(E(g7)$weight))
## [1] TRUE
ar<-pacolores(g7)
plot(g7, vertex.size=betweenness(g7),
edge.width=E(g7)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
Otro
g8 <- graph_from_adjacency_matrix(ej,
weighted=TRUE,
diag=FALSE,
mode="plus")
d2 <- function(x) { diag(x) <- diag(x)/2; x }
all(nzs((d2(ej+t(ej)))[lower.tri(ej)]) == sort(E(g8)$weight))
## [1] TRUE
ar<-pacolores(g8)
plot(g8, vertex.size=betweenness(g8),
edge.width=E(g8)$weight/900,
edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
vertex.color="#8B0A50",
vertex.frame.color=NA,
vertex.label.family="sans")
No hay comentarios.:
Publicar un comentario