Visualización de datos: introducción

Cheatsheet en español: https://diegokoz.github.io/intro_ds/fuentes/ggplot2-cheatsheet-2.1-Spanish.pdf

El ggplot2 se basa en la construcción de gráficos a partir de tres componentes: 1) Datos, 2) Coordenadas y 3) Objetos geométricos

Esto será nuestra “gramática de gráficas”

Para visualizar los resultados, nosotres asignamos variables a las propiedades visuales o estéticas

Por ejemplo: los tamaños, colores y posiciones.

De manera genérica, podríamos pensar que el código para el ggplot será de la siguiente manera: ggplot(datos)+(geometria)+(esteticas)

Vamos a establecer nuestro directorio de trabajo.

setwd("C:/Users/molar/Dropbox/2022_Trabajos/FLACSO")

Ahora cargaremos nuestros paquetes para hoy.

if(!require("pacman")) install.packages("pacman")
## Loading required package: pacman
pacman::p_load(tidyverse, readxl, writexl, haven, sjlabelled, foreign, janitor, 
               esquisse, RColorBrewer, wesanderson)

Y cargaremos la base de datos de concentrado.

load("Datos/concentrado.RData")

Elaboraremos gráficas para una sola variable, cuantitativa o cualitativa.

##Variables cuantitativas

Para las variables cuantitativas, las gráficas más utilizadas son los histogramas, gráficos de densidad.

Menos utilizados: de área y polígonos de frecuencias (ver https://r-graph-gallery.com/)

Bueno, en series de tiempo también se utilizan los gráficos de líneas.

Veamos primero los componentes de nuestra gramática. En los datos incluimos la variable que queremos y la base de datos que ocuparemos. En este caso es la edad del jefe del hogar.

concentrado %>% 
  ggplot(aes(x=edad_jefe))

Ahora agregaremos la geometría.

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Vemos que el software nos avisa cuántas clases/intervalos está utilizando. Podemos cambiarlas.

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12)

Una vez que tenemos nuestros datos y geometría, vamos a editar: primero le cambiamos el color y le quitamos el fondo gris

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()

Sobre los colores en R:Podemos agregar manualmente los colores, como lo hicimos anteriormente.

Sin embargo, existen paquetes que ya traen paletas cargadas y que se pueden utilizar dependiendo de los datos.

Una paleta es la de RColorBrewer: https://www.geeksforgeeks.org/introduction-to-color-palettes-in-r-with-rcolorbrewer/ Esta paleta de colores distingue si los datos son secuenciales, divergentes o cualitativos. Por ejemplo:

display.brewer.all(type="seq") #secuenciales

display.brewer.all(type="div") #divergentes

display.brewer.all(type="qual") #datos cualitativos

brewer.pal.info #Podemos enlistar todos los colores
##          maxcolors category colorblind
## BrBG            11      div       TRUE
## PiYG            11      div       TRUE
## PRGn            11      div       TRUE
## PuOr            11      div       TRUE
## RdBu            11      div       TRUE
## RdGy            11      div      FALSE
## RdYlBu          11      div       TRUE
## RdYlGn          11      div      FALSE
## Spectral        11      div      FALSE
## Accent           8     qual      FALSE
## Dark2            8     qual       TRUE
## Paired          12     qual       TRUE
## Pastel1          9     qual      FALSE
## Pastel2          8     qual      FALSE
## Set1             9     qual      FALSE
## Set2             8     qual       TRUE
## Set3            12     qual      FALSE
## Blues            9      seq       TRUE
## BuGn             9      seq       TRUE
## BuPu             9      seq       TRUE
## GnBu             9      seq       TRUE
## Greens           9      seq       TRUE
## Greys            9      seq       TRUE
## Oranges          9      seq       TRUE
## OrRd             9      seq       TRUE
## PuBu             9      seq       TRUE
## PuBuGn           9      seq       TRUE
## PuRd             9      seq       TRUE
## Purples          9      seq       TRUE
## RdPu             9      seq       TRUE
## Reds             9      seq       TRUE
## YlGn             9      seq       TRUE
## YlGnBu           9      seq       TRUE
## YlOrBr           9      seq       TRUE
## YlOrRd           9      seq       TRUE
display.brewer.all(colorblindFriendly=T) #La última columna nos dice si alguien con problemas para distinguir colores, los puede ver o no.

Otra paleta es la de Wesanderson, se inspira en sus peliculas: https://rforpoliticalscience.com/2020/07/26/make-wes-anderson-themed-graphs-with-wesanderson-package-in-r/ Debes escoger el nombre de la paleta y cuántos colores vas a usar.

wes_palette("Royal1")

wes_palette("GrandBudapest1")

wes_palette("Cavalcanti1")

wes_palette("Cavalcanti1", 3)

La lógica de estos paquetes es crear nuestra paleta de colores pensando en cuántos vamos a tener que utilizar. Entonces, haremos la nuestra.

pal <- wes_palette(12, name = "Royal1", type = "continuous")

Entonces, podemos volver a hacer nuestro gráfico escogiendo alguno de ellos.

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill=pal)+
  theme_classic()

Podemos agregarle el valor mínimo, máximo y la media, pero para eso tenemos que hacer un pequeño dataframe

anotaciones <- data.frame(
  x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
  y = c(2500, 17000, 2000),
  label = c("Min:", "Media:", "Max:")
) 

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")

También le vamos a agregar el título, subtítulo y fuente

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "Frecuencia",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  ) 

Al título y fuente también podemos agregarle los tipos de letra

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "Frecuencia",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  )+ 
theme(
  plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
  plot.caption = element_text(face = "italic")
)

Podemos cambiar el histograma por un gráfico de densidad, para ello cambiamos nuestra base pequeña de anotaciones.

anotaciones <- data.frame(
  x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
  y = c(0.0025, 0.025, 0.0025),
  label = c("Min:", "Media:", "Max:")
) 

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_density(adjust = 1L, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "Densidad",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  )+ 
  theme(
    plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
    plot.caption = element_text(face = "italic")
  )

Por último, también podemos hacer un boxplot

anotaciones <- data.frame(
  x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
  y = c(-0.37, 0.4, -0.37),
  label = c("Min:", "Media:", "Max:")
) 

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_boxplot(color="#000000", fill="darkblue") +
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  )+ 
  theme(
    plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
    plot.caption = element_text(face = "italic")
  )

El paquete esquisse es una forma de graficar de forma más sencilla

Variables cualitativas

Los gráficos más utilizados son los gráficos de barras.

Primero vamos a hacer nuestro primer gráfico de barras o columnas.

Al igual que en la sesión anterior, vamos agregando capas a nuestros gráficos.

Datos: incluiremos la variable que queremos graficar, en este caso: el sexo del jefe del hogar

concentrado %>% 
  ggplot(aes(x=sexo_jefe))

Ahora agregaremos la geometría

concentrado %>% 
  ggplot(aes(x=sexo_jefe)) +
  geom_bar()

Podemos voltear la geometría

concentrado %>% 
  ggplot(aes(x=sexo_jefe)) +
  geom_bar()+
  coord_flip()

Aunque, se ve mejor como estaba antes.

Para hacer nuestra gráfica de barras y que se vean las etiquetas con facilidad, convertiremos nuestra variable sexo_jefe en factor

concentrado <- concentrado %>% 
  mutate(sexo_factor = factor(concentrado$sexo_jefe, 
                              labels = c("Hombre", "Mujer")))

Ahora sí podemos ver las etiquetas en nuestro gráfico

concentrado %>% 
  ggplot(aes(x=sexo_factor)) +
  geom_bar()

Vamos a ponerle un color a hombre y otro a mujer y a quitar el fondo gris

concentrado %>% 
  ggplot(aes(x = sexo_factor, fill = sexo_factor)) +
  geom_bar() +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")
  ) +
  theme_classic()

Pero, no queremos el conteo, sino los porcentajes

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()

Ahora, le agregamos las etiquetas de los datos

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()+
geom_text(position = position_dodge(width = .9),    
          vjust = -0.5,    
          size = 3,
          colour = "black")

Modificamos los títulos y ejes

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()+
  geom_text(position = position_dodge(width = .9),    
            vjust = -0.5,    
            size = 3,
            colour = "black") +
  labs(
    x = "Sexo del jefe del hogar",
    y = "Porcentaje",
    title = "Sexo de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020",
    fill = "Sexo del jefe del hogar"
  )

Modificamos el estilo del título y la fuente

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()+
  geom_text(position = position_dodge(width = .9),    
            vjust = -0.5,    
            size = 3,
            colour = "black") +
  labs(
    x = "Sexo del jefe del hogar",
    y = "Porcentaje",
    title = "Sexo de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020",
    fill = "Sexo del jefe del hogar"
  ) +
  theme(
    plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
    plot.caption = element_text(face = "italic")
  )