1 Introducción

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

La visualización de un grafo \(G=(V,E)\) 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\).

El objetivo consiste en comunicar adecuadamente la información relacional siguiendo los principios fundamentales de una visualización:

2 Fundamentos de visualización de redes

¿CuÔl es el propósito que debe cumplir la visualización?

¿CuÔles son las propiedades que se quieren resaltar?

3 Tipos de visualización de redes

Hay disponibles diferentes tipos de visualización.

4 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 bidimensional.

Los grafos de tamaƱo no trivial deben dibujarse utilizando mƩtodos automatizados.

Se usan algoritmos que solucionan los problemas de optimización derivados del propósito de la representación automÔtica.

Los diseƱos buscan minimizar las superposiciones de vƩrtices y el cruce de aristas.

Hay disponibles varios diseƱos en igraph, entre ellos:

Estos diseños producen un arreglo de \(n\times 2\), con \(n = |V|\), con las coordenadas de los vértices en \(\mathbb{R}^2\) que se emplean en la visualización.

4.1 Ejemplo: Juego de Tronos (Game of Thrones)

Red de interacción de personajes de la temporada 1 de la serie de HBO Juego de Tronos.

Esto datos fueron recolectados para estudiar la dinƔmica de los Siete Reinos de Juego de Tronos.

Los personajes estÔn conectados mediante aristas ponderadas por el número de interacciones de los personajes.

Una descripción completa de los datos se puede encontrar aquí.

Disponible este enlace de GitHub.

suppressMessages(suppressWarnings(library(igraph)))
# datos
setwd("C:/Users/User/Dropbox/UN/networks/")
dat_nodes <- read.csv("got-s1-nodes.csv")
dat_edges <- read.csv("got-s1-edges.csv")
# vƩrtices
head(dat_nodes)
##               Id    Label
## 1 ADDAM_MARBRAND    Addam
## 2          AEGON    Aegon
## 3          AERYS    Aerys
## 4 ALLISER_THORNE Allister
## 5           ARYA     Arya
## 6       ASSASSIN Assassin
# aristas
head(dat_edges)
##         Source Target Weight Season
## 1          NED ROBERT    192      1
## 2     DAENERYS  JORAH    154      1
## 3          JON    SAM    121      1
## 4 LITTLEFINGER    NED    107      1
## 5          NED  VARYS     96      1
## 6     DAENERYS  DROGO     91      1
# grafo
got <- graph_from_data_frame(d = dat_edges[,c(1,2)], vertices = dat_nodes$Id, directed = "F") 
E(got)$weight <- dat_edges$Weight
# orden
vcount(got)
## [1] 126
# tamaƱo
ecount(got)
## [1] 549
# dirigida?
is_directed(got)
## [1] FALSE
# ponderada?
is_weighted(got)
## [1] TRUE
# diseƱos
set.seed(123)
l_n  <- layout_nicely (got)
l_dh <- layout_with_dh(got)
l_fr <- layout_with_fr(got)
l_kk <- layout_with_kk(got)
# visualización
par(mfrow = c(2,2), mar = c(4, 3, 3, 1))
plot(got, layout = l_n,  vertex.size = 4, vertex.label = NA, vertex.color = "black", vertex.frame.color = "black")
title(main = "Nicely")
plot(got, layout = l_dh, vertex.size = 4, vertex.label = NA, vertex.color = "black", vertex.frame.color = "black")
title(main = "Davidson-Harel")
plot(got, layout = l_fr, vertex.size = 4, vertex.label = NA, vertex.color = "black", vertex.frame.color = "black")
title(main = "Fruchterman-Reingold")
plot(got, layout = l_kk, vertex.size = 4, vertex.label = NA, vertex.color = "black", vertex.frame.color = "black")
title(main = "Kamada-Kawai")

5 Decoración

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

5.1 Ejemplo: Interacciones sociales

Red de interacciones sociales entre los miembros de un club de karate.

Estos datos fueron recolectados para estudiar la fragmentación que sufrió el club en dos clubes diferentes debido a una disputa entre el director y el administrador.

\(y_{i,j} = 1\) si los miembros \(i\) y \(j\) tuvieron una interacción social en el club y \(y_{i,j} = 0\) en otro caso.

Una descripción completa de los datos se puede encontrar aquí.

Disponible en el paquete igraphdata de R.

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

# install.packages("igraphdata")
suppressMessages(suppressWarnings(library(igraphdata)))
# data
data(karate)
karate <- upgrade_graph(karate)
# la representación de datos internos a veces cambia entre versiones
# orden
vcount(karate)
## [1] 34
# tamaƱo
ecount(karate)
## [1] 78
# dirigida?
is_directed(karate)
## [1] FALSE
# ponderada?
is_weighted(karate)
## [1] TRUE
# diseƱo
set.seed(123)
l <- layout_with_dh(karate)
# visualización
par(mfrow = c(1,2), mar = c(4, 3, 3, 1))
# grafo no decorado
plot(karate, layout = l, vertex.label = NA, vertex.size = 4, vertex.color = "black", vertex.frame.color = "black")
title(main = "Interacciones sociales")
# decoración
# etiquetas
V(karate)$label <- sub("Actor ", "", V(karate)$name)
# formas
V(karate)$shape <- "circle"
V(karate)[c("Mr Hi","John A")]$shape <- "rectangle"
# colores
V(karate)[Faction == 1]$color <- "red"
V(karate)[Faction == 2]$color <- "dodgerblue"
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"
# tamaƱos
V(karate)$size <- 7*sqrt(degree(karate))
E(karate)$width <- E(karate)$weight
# grafo decorado
plot(karate, layout = l, vertex.frame.color = "black", vertex.label.color = "black")
title(main = "Interacciones sociales")

5.2 Ejemplo: Referencias on-line

Red de referencias on-line entre blogs políticos franceses clasificados por el proyecto Observatoire Presidentielle en relación con su afiliación política.

Un enlace indica que al menos uno de los dos blogs hace referencia al otro en su pƔgina web.

Una descripción completa de los datos se puede encontrar aquí.

Disponible en el paquete sand de R.

# install.packages("sand")
suppressMessages(suppressWarnings(library(sand)))
# data
data(fblog)
fblog <- upgrade_graph(fblog)
# orden
vcount(fblog)
## [1] 192
# tamaƱo
ecount(fblog)
## [1] 1431
# dirigida?
is_directed(fblog)
## [1] FALSE
# ponderada?
is_weighted(fblog)
## [1] FALSE
# decoración
cols <- RColorBrewer::brewer.pal(n = 9, name = "Set1")
partido_num <- as.numeric(as.factor(V(fblog)$PolParty))
V(fblog)$color <- cols[partido_num]
E(fblog)$color <- adjustcolor("black", 0.1)
# visualización
set.seed(123)
plot(fblog, layout = layout_with_fr, vertex.size = 4, vertex.label = NA, vertex.frame.color = cols[partido_num], main = "Referencias on-line")

# contracción
fblog_c <- contract(graph = fblog, mapping = partido_num)
E(fblog_c)$weight <- 1
fblog_c <- simplify(fblog_c)
# decoración
partido_tam <- as.vector(table(V(fblog)$PolParty))
V(fblog_c)$size <- 5*sqrt(partido_tam)
E(fblog_c)$width <- sqrt(E(fblog_c)$weight)
# visualización
set.seed(123)
plot(fblog_c, vertex.label = NA, vertex.color = cols, vertex.frame.color = cols, main = "Referencias on-line")

6 Referencias