1 Introducción

Aquí se considera el problema de la visualización de redes.

La visualización de redes incorpora aspectos de matemáticos y algorítmicos junto con elementos estéticos.

2 Elementos de visualización

Se tienen datos relacionales que se quieren representar por medio de un grafo \(G=(V,E)\) con vértices \(V\) y aristas \(E\), y que ahora se quieren resumir visualmente.

La visualización de grafos consiste en crear representaciones geométricas de grafos utilizando símbolos para los vértices \(v \in V\) y curvas suaves para las aristas \(e \in E\)

Hay incontables maneras en las que es posible representar \(G\). Sin embargo, la cuestión importante consiste en comunicar adecuadamente la información relacional contenida en \(G\).

Los grafos de tamaño no trivial deben dibujarse utilizando métodos automatizados.

Se usan algoritmos computacionalmente eficientes que solucionan los problemas de optimización derivados de la representación automática de grafos.

3 Datos

3.1 Lazega

Red de relaciones de trabajo colaborativo entre miembros de una firma de abogados. Disponible en la librería sand de R.

Lazega, E. (2001). The collegial phenomenon: The social mechanisms of cooperation among peers in a corporate law partnership. Oxford University Press on Demand.

suppressMessages(suppressWarnings(library(igraph)))
suppressMessages(suppressWarnings(library(igraphdata)))
suppressMessages(suppressWarnings(library(sand)))

# grafo
lazega <- graph_from_data_frame(d = elist.lazega, directed = "F")

# orden
vcount(lazega)
## [1] 34
# tamaño
ecount(lazega)
## [1] 115
# dirigida?
is_directed(lazega)
## [1] FALSE

3.2 Blogs de SIDA

Red de blogs asociados con el SIDA, los pacientes y sus redes de apoyo. Un enlace dirigido de un blog a otro indica que el primero tiene un enlace al segundo en su página web. Disponible en la libreria sand de R.

Miller, H. J. (2007). Societies and cities in the age of instant access. In Societies and cities in the age of instant access (pp. 3-28). Springer, Dordrecht.

# datos
data(aidsblog)

# orden
vcount(aidsblog)
## [1] 146
# tamaño
ecount(aidsblog)
## [1] 187
# dirigida?
is_directed(aidsblog)
## [1] TRUE

3.3 Blogs de política

Red de blogs políticos franceses clasificados por el proyecto Observatoire Presidentielle en cuanto a afiliación política. Un enlace indica que al menos uno de los dos blogs hacía referencia al otro en su página web. Disponible en la libreria sand de R.

Fuente original: http://observatoire-presidentielle.fr/

# datos
data(fblog)

# orden
vcount(fblog)
## [1] 192
# tamaño
ecount(fblog)
## [1] 1431
# dirigida?
is_directed(fblog)
## [1] FALSE

3.4 Caltech

Red de Facebook de estudiantes de Caltech cuyos enlaces representan amistades entre usuarios. Disponible en https://networkrepository.com/socfb-Caltech36.php

Red, V., Kelsic, E. D., Mucha, P. J., & Porter, M. A. (2011). Comparing community structure to characteristics in online collegiate social networks. SIAM review, 53(3), 526-543.

# datos
setwd("C:/Users/Juan Camilo/Dropbox/UN/networks_2021_2")
dat <- read.table("caltech.txt", quote="\"", comment.char="")
caltech  <- graph_from_data_frame(d = dat, directed = "F") 

# orden
vcount(caltech)
## [1] 769
# tamaño
ecount(caltech)
## [1] 16656
# dirigida?
is_directed(caltech)
## [1] FALSE

4 Algunos diseños

Uno de los temas centrales de la visualización de grafos es el diseño del grafo (graph layout), i.e., la ubicación de los vértices y las aristas en el espacio (típicamente bidimensional).

Hay disponibles demasiadas formas de diseño, entre ellas:

4.1 Circular

https://igraph.org/r/doc/layout_in_circle.html

igraph_options(vertex.label = NA, edge.arrow.size = 0.5, vertex.color = 1, vertex.frame.color = "black")
par(mfrow = c(1,2))
plot(lazega, layout = layout_in_circle, vertex.size = 6)
title(main = "Lazega")
plot(aidsblog, layout = layout_in_circle, vertex.size = 3)
title(main = "Blogs de SIDA")

4.2 Diseño del algoritmo de Fruchterman y Reingold

Fruchterman, T.M.J. and Reingold, E.M. (1991). Graph Drawing by Force-directed Placement. Software - Practice and Experience, 21(11):1129-1164.

https://igraph.org/r/doc/layout_with_fr.html

igraph_options(vertex.label = NA, edge.arrow.size = 0.5, vertex.color = 1, vertex.frame.color = "black")
par(mfrow = c(1,2))
plot(lazega, layout = layout_with_fr, vertex.size = 6)
title(main = "Lazega")
plot(aidsblog, layout = layout_with_fr, vertex.size = 4)
title(main = "Blogs de SIDA")

4.3 Algoritmo de Kamada-Kawai

Fruchterman, T.M.J. and Reingold, E.M. (1991). Graph Drawing by Force-directed Placement. Software - Practice and Experience, 21(11):1129-1164.

https://igraph.org/r/doc/layout_with_fr.html

igraph_options(vertex.label = NA, edge.arrow.size = 0.5, vertex.color = 1, vertex.frame.color = "black")
par(mfrow = c(1,2))
plot(lazega, layout = layout_with_kk, vertex.size = 6)
title(main = "Lazega")
plot(aidsblog, layout = layout_with_kk, vertex.size = 4)
title(main = "Blogs de SIDA")

4.4 Algoritmo de Davidson-Harel

Ron Davidson, David Harel: Drawing Graphs Nicely Using Simulated Annealing. ACM Transactions on Graphics 15(4), pp. 301-331, 1996.

https://igraph.org/r/doc/layout_with_dh.html

igraph_options(vertex.label = NA, edge.arrow.size = 0.5, vertex.color = 1, vertex.frame.color = "black")
par(mfrow = c(1,2))
plot(lazega, layout = layout_with_dh, vertex.size = 6)
title(main = "Lazega")
plot(aidsblog, layout = layout_with_dh, vertex.size = 4)
title(main = "Blogs de SIDA")

4.5 DrL

This function implements the force-directed DrL layout generator.

https://igraph.org/r/doc/layout_with_drl.html

igraph_options(vertex.label = NA, vertex.color = 1, vertex.frame.color = "black")
set.seed(42)
plot(caltech, layout = layout_with_drl, vertex.size = 5, edge.color = "gray80")
title(main = "Caltech")

4.6 Decoración

Si bien las posiciones de los vértices y la ubicación de las aristas es claramente importante en la visualización de grafos, la información adicional se puede incorporar a las visualizaciones variando características como el tamaño, la forma y el color de los vértices y los bordes.

4.7 Ejemplo: Lazega

# data
data(lazega)
# color: ubicacion de la oficina
v.colors <- c("red","dodgerblue","goldenrod")[V(lazega)$Office]
# forma del vertice: tipo de practica 
v.shapes <- c("circle","square")[V(lazega)$Practice]
# tamaño del vertice: proporcional a años de servicio
v.size <- 3.5*sqrt(V(lazega)$Years)
# etiquetas
v.label <- V(lazega)$Seniority
# diseño
set.seed(42)
l <- layout_with_fr(lazega)
# grafico
plot(lazega, layout = l, vertex.color = v.colors, vertex.shape = v.shapes, vertex.size = v.size, vertex.label = v.label, edge.color = "gray50", vertex.frame.color = "black", vertex.label.color = "black")
title(main = "Lazega")

4.8 Ejemplo: Zachary

Los nodos representan a los miembros de un club de karate observado durante aproximadamente 2 años y los enlaces que conectan dos nodos indican interacciones sociales entre los dos miembros correspondientes. Este conjunto de datos es importante desde una perspectiva científica dada la división del club en dos clubes diferentes debido a una disputa entre el director y el administrador.

Zachary, W. W. (1977). An information flow model for conflict and fission in small groups. Journal of anthropological research, 33(4), 452-473.

# data
data(karate)
# diseño
set.seed(42)
l <- layout_with_kk(karate)
par(mfrow = c(1,2))
# grafico (no decorado)
plot(karate, layout = l, vertex.label = V(karate), vertex.size = 12, vertex.color = NA, edge.color = "gray50", vertex.frame.color = "black", vertex.label.color = "black")
title(main = "Zachary")
# decorar grafico
# etiquetas
V(karate)$label <- sub("Actor ", "", V(karate)$name)
# forma del vertice
V(karate)$shape <- "circle"
V(karate)[c("Mr Hi","John A")]$shape <- "rectangle"
# color del vertice
V(karate)[Faction == 1]$color <- "red"
V(karate)[Faction == 2]$color <- "dodgerblue"
# tamaño vertice
# strength: peso total de las aristas incidentes, E(karate)$weight
V(karate)$size <- 4*sqrt(strength(karate))
# grosor de aristas
E(karate)$width <- E(karate)$weight
# color de aristas
F1 <- V(karate)[Faction == 1]
F2 <- V(karate)[Faction == 2]
E(karate)[F1 %--% F1]$color <- "pink"
E(karate)[F2 %--% F2]$color <- "lightblue"
E(karate)[F1 %--% F2]$color <- "yellow"
# posicion etiquetas (default = 0)
V(karate)$label.dist <- ifelse(V(karate)$size >= 9.0, 0, 1.0)
# grafico (decorado)
plot(karate, layout = l, vertex.frame.color = "black", vertex.label.color = "black")
title(main = "Zachary")

# egonetworks
k.nbhds <- make_ego_graph(graph = karate, order = 1)
k.1  <- k.nbhds[[1]]
k.34 <- k.nbhds[[34]]
# grafico
par(mfrow = c(1,2))
plot(k.1, vertex.label = NA, vertex.frame.color = "black", vertex.color = c("red", rep("lightblue", 16)))
title(main = "Ego-network actor 1")
plot(k.34, vertex.label = NA, vertex.frame.color = "black", vertex.color = c(rep("lightblue", 17), "red"))
title(main = "Ego-network actor 34")

4.9 Ejemplo: Blogs de política

par(mfrow = c(1,2))
# color de vertices
cols <- RColorBrewer::brewer.pal(n = 9, name = "Set1")
party.nums <- as.numeric(as.factor(V(fblog)$PolParty))
V(fblog)$color <- cols[party.nums]
# grafico con Kamada-Kawai 
set.seed(42)
plot(fblog, layout = layout_with_kk(fblog), vertex.label=NA, vertex.size = 5, vertex.frame.color = "black")
title(main = "Blogs de política")
# grafico con DrL
set.seed(42)
plot(fblog, layout = layout_with_drl(fblog), vertex.label = NA, vertex.size = 5, vertex.frame.color = "black")
title(main = "Blogs de política")

# contraccion
party.nums <- as.numeric(as.factor(V(fblog)$PolParty))
fblog.c <- contract(graph = fblog, mapping = party.nums)
E(fblog.c)$weight <- 1
fblog.c <- simplify(fblog.c)
# grafico
party.names <- sort(unique(V(fblog)$PolParty))
party.names[c(2,4,5)] <- c(" Analystes"," Liberaux"," Gauche")
party.size <- as.vector(table(V(fblog)$PolParty))
igraph_options(vertex.frame.color = "black")
set.seed(42)
plot(fblog.c, vertex.size = 5*sqrt(party.size), vertex.label = party.names, vertex.color = cols, vertex.label.color = "black", vertex.frame.color = "black", edge.width = sqrt(E(fblog.c)$weight), vertex.label.dist = 0)
title(main = "Blogs de política")