Visualización de datos

Luis D. Verde Arregoitia

Temas de este bloque:

  • Introducción a ggplot2
  • Representaciones gráficas de información
  • Personalización de elementos gráficos (ejes, colores, fuentes, leyendas)
  • Exportando gráficos de alta resolución
  • Preparación de figuras científicas
  • Figuras complejas

Paquetes para hoy

Por si no los tienen:

install.packages("ggplot2")
install.packages("ggthemes") 
install.packages("ragg")
install.packages("patchwork")
install.packages("forcats")

ggplot2

The Grammar of Graphics
Wilkinson (1999, 2005)

A Layered Grammar of Graphics
Hadley Wickham (2007)

Una gramática puede ayudar a construir oraciones diferentes con una pequeña cantidad de verbos, sustantivos y adjetivos, en lugar de memorizar cada oración específica. Una pequeña cantidad de los componentes básicos de ggplot2 y de su gramática puede crear cientos de gráficos diferentes.

Introducción a la ciencia de datos
Rafael A. Irizarry (2020)

Galería

Compilada por Cédric Scherer

curso de diseño gráfico con ggplot2 - 2022

BBC R Cookbook

#TidyTuesday semana 2020/31

The Economist

#TidyTuesday semana 2020/08

Storytelling With Data”

#TidyTuesday semana 2021/15 por Jake Kaupp

#TidyTuesday por Jack Davison

Concurso BES MoveMap

Choropeta y Relieve por Timo Gossenbacher

arte de Thomas Lin Pedersen

Gramática de gráficos

Modificado de Wickham (2007)

ggplot(data, aes(x,y)) +
  geom_point()



ggplot() crea el gráfico

aes() determina los vínculos entre las variables y las propiedades del gráfico

geom_* define la capa con la representación visual de los datos

largo peso edad
9 20 adulto
8 13 juvenil
7 15 juvenil
13 18 adulto
11 21 adulto
6 14 juvenil
lagartijas <- 
tibble::tribble(
  ~largo, ~peso,     ~edad,
      9L,   20L,  "adulto",
      8L,   13L, "juvenil",
      7L,   15L, "juvenil",
     13L,   18L,  "adulto",
     11L,   21L,  "adulto",
      6L,   14L, "juvenil"
  )
largo peso edad
9 20 adulto
8 13 juvenil
7 15 juvenil
13 18 adulto
11 21 adulto
6 14 juvenil
x y figura
9 20 círculo
8 13 triángulo
7 15 triángulo
13 18 círculo
11 21 círculo
6 14 triángulo

ggplot(data = lagartijas,     
  aes(x = largo,y = peso))+
  geom_point()

Ejercicio

ranas.csv
01_armar-plots.R




Datos sobre tamaño corporal, frecuencia dominante, y hábitat de 176 especies de ranas, tomados de Muñoz et al. (2020)

Personalización de figuras

Modificando elementos gráficos

labs
fill
color
size
themes
scale_fill_*
scale_shape_*
scale_color_*

rótulos para ejes, títulos, subtítulos, etc. colores de rellenos
colores de bordes
tamaño o grueso de elementos
apariencias predefinidas

control manual sobre mapeos estéticos (colores, rellenos, formas)

ggplot2 cuenta con valores predeterminados para asignar formas y colores diferentes a diferentes niveles de variables categóricas

Podemos especificar manualmente las formas y colores para las categorías con un vector que se le da al argumento values

Para dos categorías con dos niveles c/u:

aes(x,y, color = var1, shape = var2)+
 scale_color_manual(values=
                      c('lightskyblue4','blue'))+
 scale_shape_manual(values=c
                    (20,21))

Colores

nombres HTML

Colores

Códigos hexagesimales

Free Color Picker (Windows); Gpick (Linux); ColorSlurp (Mac)

Paletas de color

  • Especificar por nombre
  • Definir con un vector

🔗 Galería de ejemplos de paletteer

🔗 Pokepalettes

El argumento name modifica el título de la leyenda que se genera automáticamente para los mapeos

aes(x,y, color = var1, shape = var2)+
    scale_shape_manual(values=c(20,21),
                       name = 'Variable Dos')+
    scale_color_manual(values=c('red','blue'), 
                       name= 'Variable Uno')

Variables cuantitativas + color:

  • Rampa de colores asignada automáticamente
  • Definir rampa con scale_x_gradient o asignar rampa predeterminada
ggplot(ranas,
       aes(x=svl, y=freq_dom,
           fill=svl))+
  geom_point(size=4,color="white",
             pch=21)+
  labs(x="Tamaño Corporal (SVL)",
       y="Frequencia Dominante (Hz)",
       title="Llamados Ranas")

Ejercicio

Modificando parámetros gráficos

ranas.csv
02_personalizar-figuras.R

Temas (apariencias predeterminadas)

Controlan múltiples aspectos de la apariencia del gŕafico sin alterar los datos.

Otras rampas de color

  • Para poder percibir un valor central y acomodar valores de menor a mayor

🔗 Fabio Crameri - Scientific Color Maps

Rampas de color uniformes (perceptualmente)

viridis

  • instaladas con ggplot2
  • usar con scale_x_viridis()

scico

  • instaladas con scico
  • divergentes y secuenciales

Ejercicio

Variables continuas y colores

ranas.csv
03_rampas.R

Exportando gráficos

Opciones

  • Con botón ‘Export’ de RStudio
  • Con dispositivos gráficos
  • Con ggsave()
  • Formato: png (preferible), jpg, pdf, etc.

Exportando con dispositivo gráfico

Los gráficos se pueden asignar a objetos en el entorno de trabajo

figura_ranas <- 
ggplot(ranas,
       aes(x=svl,y=freq_dom,fill=svl))+
  geom_point(size=4,color="white",pch=21)

png(filename = "mifigura.png",
    width = 10, 
    height = 10,
    units ="cm",
    res = 200)
figura_ranas
dev.off()

Dispositivos gráficos de ragg

  • Más rápidos y mejor resolución
  • Disponibles instalando el paquete ragg
figura_ranas <- 
ggplot(ranas,aes(x=svl,y=freq_dom,fill=svl))+
  geom_point(size=4,color="white",pch=21)

ragg_png(filename = "mifigura.png",
    width = 10, height = 10,
    units ="cm",
    res = 200)
figura_ranas
dev.off()

ggsave()

  • Usa ragg si lo encuentra instalado
ggsave(figura_ranas, 
  filename = "mifigura.png",
    width = 10, 
    height = 10,
    units ="cm",
    dpi = 200)

¿Quedó raro?

Argumento scale en ggsave() y scaling en dispositivos de ragg para ajustar

Figuras multipanel

Funciones facet()

facet_wrap() para separar por una sola variable y ‘envolver’

facet_grid() para separar con combinaciones de variables

Ejercicio

Múltiplos

cafeteria.csv
04_multipanel.R

Reordenar elementos (ejes, paneles)

Orden alfabético de los niveles de la variable tipo

ggplot(cafeteria,aes(carbohidratos,proteina))+
  geom_point()+facet_wrap("tipo")

Factores

  • Variables categóricas
  • conjunto fijo y conocido de valores posibles
  • muy útiles para ordenar vectores en un orden distinto al alfabético

Categorías

cafeteria$tipo

Categorías

 [1] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
 [6] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
[11] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
[16] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
[21] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
[26] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
[31] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
[36] "horneado"     "horneado"     "horneado"     "horneado"     "horneado"    
[41] "horneado"     "almuerzo"     "almuerzo"     "almuerzo"     "almuerzo"    
[46] "almuerzo"     "almuerzo"     "almuerzo"     "almuerzo"     "individuales"
[51] "individuales" "individuales" "individuales" "individuales" "individuales"
[56] "individuales" "individuales" "individuales" "desayuno"     "desayuno"    
[61] "desayuno"     "desayuno"     "desayuno"     "desayuno"     "desayuno"    
[66] "desayuno"     "ensalada"     "sandwich"     "sandwich"     "sandwich"    
[71] "sandwich"     "sandwich"     "sandwich"     "sandwich"     "lácteos"     
[76] "lácteos"      "lácteos"     

factor(cafeteria$tipo)

 [1] horneado     horneado     horneado     horneado     horneado    
 [6] horneado     horneado     horneado     horneado     horneado    
[11] horneado     horneado     horneado     horneado     horneado    
[16] horneado     horneado     horneado     horneado     horneado    
[21] horneado     horneado     horneado     horneado     horneado    
[26] horneado     horneado     horneado     horneado     horneado    
[31] horneado     horneado     horneado     horneado     horneado    
[36] horneado     horneado     horneado     horneado     horneado    
[41] horneado     almuerzo     almuerzo     almuerzo     almuerzo    
[46] almuerzo     almuerzo     almuerzo     almuerzo     individuales
[51] individuales individuales individuales individuales individuales
[56] individuales individuales individuales desayuno     desayuno    
[61] desayuno     desayuno     desayuno     desayuno     desayuno    
[66] desayuno     ensalada     sandwich     sandwich     sandwich    
[71] sandwich     sandwich     sandwich     sandwich     lácteos     
[76] lácteos      lácteos     
7 Levels: almuerzo desayuno ensalada horneado individuales ... sandwich

levels(factor(cafeteria$tipo))

[1] "almuerzo"     "desayuno"     "ensalada"     "horneado"     "individuales"
[6] "lácteos"      "sandwich"    

Factores

Los niveles de un factor se pueden especificar manualmente con un vector en el argumento levels

Para cualquier otra manipulación de factores:
forcats

  • reordenar una variable según los valores de otra
  • suprimir orden alfabético
  • invertir orden de los niveles
  • agrupar niveles
  • etc.

Ejercicio

edad_gateo.csv
05_reordenar.R

Datos sobre la edad (semanas) de gateo en relación a temperatura y mes de nacimiento. Tomado de Benson (1993).

Figuras compuestas

patchwork

  • Símbolo + para acomodar dos gráficos juntos
  • Símbolo | para figuras lado a lado
  • Símbolo / para apilar figuras
  • Álgebra simple para anidar y acomodar elementos
  • plot_layout() para controlar la composición
  • plot_annotation() para rotular elementos o agregar textos
ggplot(cafeteria,aes(carbohidratos,grasa))+
     geom_point()+
ggplot(cafeteria,aes(energia,proteina))+
     geom_point()  

Más fácil de leer:

grasaCarb <- ggplot(cafeteria,aes(carbohidratos,grasa))+
     geom_point()
protEnergia <- ggplot(cafeteria,aes(energia,proteina))+
     geom_point()  

grasaCarb+protEnergia

Tres figuras:

grasaCarb+protEnergia+
  ggplot(ranas,
       aes(x=svl,y=freq_dom,fill=svl))+
  geom_point(size=4,color="white",pch=21)

En una sola columna

puntos_ranas <- 
  ggplot(ranas,aes(x=svl,y=freq_dom,fill=svl))+
  geom_point(size=4,color="white",pch=21)
grasaCarb+protEnergia+puntos_ranas+
  plot_layout(ncol=1)

Anidando:

(grasaCarb+protEnergia)/puntos_ranas

(grasaCarb/protEnergia)|puntos_ranas

Anotaciones

((grasaCarb/protEnergia)|puntos_ranas)+
  plot_annotation(title="Mi figura de tres elementos",
                  subtitle = "ejemplo de patchwork",
                  tag_levels = "A")

tag_levels genera diferentes secuencias alfabéticas o numéricas para identificar a cada elemento

Texto con formato

Podemos usar markdown para darle formato al texto que aparece en diferentes elementos de nuestras gráficas, a través de la función element_markdown() del paquete ggtext

Documentación del paquete

library(ggtext)
ggplot(cafeteria,aes(carbohidratos,grasa,color=bajo_grasa))+
geom_point()+
  scale_color_discrete(labels=c("Chatarra  **Grasienta**","light"))+
  theme(legend.text = element_markdown())

ggplot(cafeteria,aes(carbohidratos,grasa,color=bajo_grasa))+
geom_point()+
  scale_color_discrete(labels=c("Chatarra  **Grasienta**","light"))+
  theme(legend.text = element_markdown())

Extensiones para ggplot2

Taller LatinR

Galería oficial de extensiones