Torre de Babel

Cómo generar gráficas avanzadas con R

by Francisco Charte.

Las posibilidades gráficas en R son muy extensas, habiendo disponibles varias decenas de paquetes que, como ggplot, ofrecen un extenso conjunto de comandos para elaborarlas. A continuación aprenderemos a usar algunas de ellas.

Combinación de múltiples gráficas

La posibilidad de combinar en una misma imagen múltiples gráficas facilita la comparación visual rápida, por ejemplo entre distintas variables.

plot(iris[ ,-5], col = iris$Species)

ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
  geom_point() + facet_wrap(~Species)

grafica <- ggplot(diamonds, aes(price)) + 
  geom_histogram(bins=20, color="black", fill="yellow") + 
  scale_x_log10()
  
grafica + facet_wrap(~cut, scales = "free_y")

grafica + facet_grid(color~cut, scales = "free_y")  

Representación de relaciones

Las gráficas circulares conocidas como tipo circos facilitan la visualización de porcentajes y relaciones entre variables:

library(circlize) # Cargamos el paquete necesario para esta gráfica

HairEyeColor # Examinamos el dataset HairEyeColor
## , , Sex = Male
## 
##        Eye
## Hair    Brown Blue Hazel Green
##   Black    32   11    10     3
##   Brown    53   50    25    15
##   Red      10   10     7     7
##   Blond     3   30     5     8
## 
## , , Sex = Female
## 
##        Eye
## Hair    Brown Blue Hazel Green
##   Black    36    9     5     2
##   Brown    66   34    29    14
##   Red      16    7     7     7
##   Blond     4   64     5     8
# Podemos traducir las denominaciones
attr(HairEyeColor,"dimnames")$Eye <- c("Marrones", "Azules", "Avellana", "Verdes")  
attr(HairEyeColor,"dimnames")$Hair <- c("Negro", "Castaño", "Pelirrojo", "Rubio")  

chordDiagram(HairEyeColor[,,2])

Comparación de diferentes alternativas atendiendo a varios criterios

En ocasiones se cuenta con diferentes vías para solucionar un mismo problema y la calidad de cada una de ellas puede evaluarse con distintos criterios, lo cual dificulta el análisis y selección de la mejor opción. La gráfica de tipo radar o spider está pensada para estos casos.

library('fmsb')  # Cargamos el paquete donde está el comando
## Warning: package 'fmsb' was built under R version 3.2.5
dat <- data.frame(    # Simulamos tres métodos con cinco criterios de evaluación
  Prec = runif(3, 0, 1),
  Accu  = runif(3, 0, 1),
  Reca    = runif(3, 0, 1),
  AUC       = runif(3, 0, 1),
  Kapp     = runif(3, 0, 1)
  )
rownames(dat) <- c("SVM", "C4.5", "MLP")

radarchart(dat, maxmin = FALSE) # Dibujamos la gráfica

# Agregamos una leyenda para indicar los criterios
legend("bottomleft", rownames(dat),
       col = c('black', 'green', 'red'),
       lty = 1:3, lwd = 2, ncol = 1)

Alternativamente, también podría utilizarse una gráfica de tipo heatmap. Esta es una matriz en la que se representan todos los posibles valores, asignando un color a cada celdilla en función del valor correspondiente:

heatmap(as.matrix(dat), scale="column", Colv=NA, Rowv=NA)

Representación gráfica de funciones

R es capaz de representar cualquier función matemática, ya sea una función incluida en R o cualquier otra que podamos necesitar siempre que la definamos de forma adecuada. Los siguientes son algunos ejemplos:

# Curva a partir de funciones existentes (sin y cos)
curve(sin, from = -4, to = 4, col = 'blue', lty = 'dotted', lwd = 2,
      ylab='sin(x) vs cos(x)', xname = "Valores de entrada")
curve(cos, from = -4, to = 4, col = 'cyan', lty = 'dashed', lwd = 2, add = TRUE)
legend("topleft", c("sin(x)", "cos(x)"), col = c('blue', 'cyan'),
       lty = c('dotted','dashed'), lwd = 2, ncol = 2)

# Curva del valor absoluto
curve(abs, from = -10, to = 10)

# Curvas a partir de polinomios
curve(x^2 - x, lty = 3, lwd = 2, from = -10, to = 10)
curve(x^3 - x^2 + 1, lty = 2, lwd = 2, from = -10, to = 10, add = TRUE)

# A partir de una función parámetrica definida por el usuario
heart <- function(t) {
  x <- 16 * sin(t)^3
  y <- 13 * cos(t) - 5 * cos(2*t) - 2 * cos(3*t) - cos(4*t)
  c(x,y)
}

mpoints <- matrix(sapply(seq(0,2*pi,0.1), heart), ncol = 2, byrow = TRUE)
plot(mpoints)
lines(mpoints)

Geometría con gráficos de tortuga

Incluso podemos generar gráficos con geometrías definidas algorítmicamente acorde con el lenguaje Logo, conocidos como gráficos de tortuga:

library('TurtleGraphics')
## Warning: package 'TurtleGraphics' was built under R version 3.2.5
## Loading required package: grid
turtle_init()

turtle_do({
  for(j in 1:45) {
    for(i in 1:6) {
      turtle_forward(20)
      turtle_right(360/6)
    }
    turtle_right(360/45)
  }
})

Almacenamiento de las gráficas

Tras generar una gráfica lo habitual es que nos interese guardarla en algún formato a fin de, posteriormente, imprimirla o incluirla en algún estudio. El panel Plots de RStudio, en el que han ido apareciendo las gráficas de los ejercicios, cuenta con un menú Export desde el que podemos guardar la gráfica actual tanto en formato PDF como en distintos formatos gráficos.

El panel para guardar una gráfica

El panel para guardar una gráfica

La mayoría de formatos gráficos son estáticos, por lo que únicamente permiten mostrar una configuración concreta de la información representada. Algunos de ellos, sin embargo, contemplan el uso de animaciones. Con el comando saveGIF() del paquete animation podemos generar una gráfica animada, mostrando cómo cambia la función representada en función de algún parámetro de entrada. En lugar de saveGIF() podemos utilizar el comando saveVideo() para generar un vídeo MPEG.

library(animation)

saveGIF({
  for(lim in seq(-3.14,3.14,by=0.1))
    curve(sin, from=lim,  to=lim + 9)
}, movie.name="animacion.gif", interval=0.2, ani.width=640, ani.height=640)
## Executing: 
## ""convert" -loop 0 -delay 20 Rplot1.png Rplot2.png Rplot3.png
##     Rplot4.png Rplot5.png Rplot6.png Rplot7.png Rplot8.png
##     Rplot9.png Rplot10.png Rplot11.png Rplot12.png Rplot13.png
##     Rplot14.png Rplot15.png Rplot16.png Rplot17.png Rplot18.png
##     Rplot19.png Rplot20.png Rplot21.png Rplot22.png Rplot23.png
##     Rplot24.png Rplot25.png Rplot26.png Rplot27.png Rplot28.png
##     Rplot29.png Rplot30.png Rplot31.png Rplot32.png Rplot33.png
##     Rplot34.png Rplot35.png Rplot36.png Rplot37.png Rplot38.png
##     Rplot39.png Rplot40.png Rplot41.png Rplot42.png Rplot43.png
##     Rplot44.png Rplot45.png Rplot46.png Rplot47.png Rplot48.png
##     Rplot49.png Rplot50.png Rplot51.png Rplot52.png Rplot53.png
##     Rplot54.png Rplot55.png Rplot56.png Rplot57.png Rplot58.png
##     Rplot59.png Rplot60.png Rplot61.png Rplot62.png Rplot63.png
##     "animacion.gif""
## Output at: animacion.gif
## [1] TRUE
Animación producida por el código previo

Animación producida por el código previo