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:
Tomado de https://kateto.net/network-visualization .
¿CuÔl es el propósito que debe cumplir la visualización?
¿CuÔles son las propiedades que se quieren resaltar?
Tomado de https://kateto.net/network-visualization .
Hay disponibles diferentes tipos de visualización.
Tomado de https://kateto.net/network-visualization .
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.
Tomado de https://kateto.net/network-visualization .
Hay disponibles varios diseƱos en igraph
, entre
ellos:
layout_as_bipartite()
.layout_as_star()
.layout_as_tree()
.layout_in_circle()
.layout_nicely()
.layout_on_grid()
.layout_on_sphere()
.layout_randomly()
.layout_with_dh()
.layout_with_fr()
.layout_with_gem()
.layout_with_graphopt()
.layout_with_kk()
.layout_with_lgl()
.layout_with_mds()
.layout_with_sugiyama()
.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.
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")
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.
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")