class: left, bottom, inverse background-image: url(Figuras/UC2.png) background-position: 86% 10% background-size: 28% # Clase 10: Visualización de datos - Parte II ---- ## **Computación Estadística** ### Prof. Ana María Alvarado ### Primer Semestre 2024 <br> --- class: left, middle # La clase de hoy ---- ## Packages de esta clase .pull-left[ * `ggplot2` * `dplyr` * `tidyverse` * `RColorBrewer` * `GGally` * `gridExtra` ] .pull-right[ * `ggrepel` * `plotly` * `gganimate` * `gifski` * `scales` ] --- name: bases ## Bases de datos a usar En esta clase, se usarán distintas bases de datos precargadas de la librería `datos`. Principalmente, se usarán las bases `paises` (conocida en inglés como `gapminder`) y `mtautos` (conocida en inglés como `mtcars`). Además, se creará dos sub bases para trabajar de manera más acotada: * **base_chile**: Base con los datos de Chile, sacada desde `paises`. * **base_vecinos**: Base con los datos de Chile y sus países vecinos, sacada desde `paises`. * **america07**: Base con la información del continente americano en el año 2007. ```r library(tidyverse) library(datos) base_chile = paises %>% filter(pais=="Chile") base_vecinos = paises %>% filter(pais %in% c("Chile","Perú","Bolivia","Argentina")) america07 = paises %>% filter(anio==2007, continente == "Américas") ``` --- name: barra # Gráfico de barra `geom_bar()` En `ggplot2` los gráficos de barras se realizan con el comando `geom_bar()`, indicando en el argumento `aes()` desde cual variable queremos discriminar. ```r ggplot(data = mtautos, aes(x = factor(cilindros))) + geom_bar(aes(fill = factor(cilindros))) + theme(legend.position = 'none') ``` .pull-left[ * Por defecto el gráfico de barras grafica en el eje y la cuenta de las observaciones en cada grupo. Esto puede modificarse dentro del comando `aes()` dentro del comando `geom_bar()`. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/fig-barr-out-1.png" width="288" style="display: block; margin: auto;" /> ] --- ```r ggplot(data = mtautos, aes(x = factor(cilindros) )) + * geom_bar(aes(y = ..count../sum(..count..), fill = factor(cilindros))) + * scale_y_continuous(labels = scales::percent) + theme(legend.position = 'none') ``` .pull-left[ * `y=..count../sum(..count..)`dentro del argumento `aes()` permite graficar un gráfico de proporciones. La sentencia anterior calcula en cada grupo la cuenta y lo divide por el total acumulado. * La función `scale_y_continuous` permite modificar el eje y del gráfico. En este caso el argumento interior transforma el eje en porcentajes, esto usando la función `percent` de la librería `scales`. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/fig-barr2-out-1.png" width="504" style="display: block; margin: auto;" /> ] --- # Gráficos de torta En `ggplot2` no hay una función **`geom_*`** que nos genere directamente un gráfico de torta (pie chart), pero existe una manera de generarlo a partir de un gráfico de barras (`geom_bar()`) de la siguiente forma: **1.- Generar una base de datos con las frecuencias a graficar.** Usaremos el comando `table()` para obtener las frecuencias de los cilindros de los automóviles de la base `mtautos` de la librería `datos`. Luego la tranformamos a una base de datos con el comando `data.frame()`. ```r df_cilindros = with(mtautos, table(cilindros)) %>% data.frame() df_cilindros ``` ``` ## cilindros Freq ## 1 4 11 ## 2 6 7 ## 3 8 14 ``` --- **2.- Generamos un barplot de una barra.** Usamos la base creada para graficar un barplot. Usaremos la variable `cilindros` para pintar las barras y la variable `Freq` para determinar el tamaño de cada una. ```r plot_barra = ggplot(df_cilindros, aes(x = "", y = Freq, fill = cilindros)) + geom_bar(stat = 'identity', width = 1) ``` .pull-left[ * **`stat = 'identity'`** permite graficar los datos como aparecen en la base de datos. En este caso es necesario dado que los datos ya están agrupados. * **`width = 1`** permite graficar el barplot agrupado en una barra. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/plot-pie2-out-1.png" width="504" /> ] --- **3.- Usamos el comando `coord_polar()` para definir un gráfico de tortas.** El comando `coord_polar()` nos permite tranformar un eje de un gráfico de `ggplot2` a coordenadas polares. En este caso lo usaremos para tranformar el gráfico `plot_barra` a un gráfico de torta: ```r plot_torta1 = plot_barra + coord_polar("y", start = 0) ``` .pull-left[ * El argumento **"y"** indica cual eje queremos tomar como referencia. En este caso es el eje y, dado que es el eje por el cual se graficó la variable `Freq`. * El argumento **start = 0** define el punto dentro de las coordenadas polares en donde inicia el gráfico. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/plot-pie3-out-1.png" width="504" /> ] --- **4.- Modificaciones visuales** En la siguiente slide realizamos algunas modificaciones visuales para mejorar el gráfico: ```r plot_torta2 = plot_torta1 + theme_void() + theme(legend.position = "bottom") + labs(fill = "N° de cilindros:") ``` .pull-left[ * **`theme_void`** elimina la mayoría de los objetos visuales del gráfico, incluyendo fondo y ejes de gráficos. * En **`theme`** modificamos la leyenda, ubicándola en la parte inferior del gráfico. * En **`labs`** modificamos el título de la leyenda. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/plot-pie4-out-1.png" width="504" /> ] --- name: lineas # Líneas en gráficos Existen distintos comandos que nos permiten añadir lineas o segmentos a nuestros gráficos de `ggplot2`. .large[**Añadir líneas horizontales o verticales**] .pull-left[ El comando **`geom_hline()`** permite colocar una línea horizontal en el o los puntos indicados por el argumento `yintercept`. ] .pull-right[ El comando **`geom_vline()`** permite colocar una línea vertical en el o los puntos indicados en el argumento `xintercept`. ] Estas funciones tienen los siguientes argumentos en común: * **`linetype`**: Tipo de línea (`'solid'`,`'dotted'`, `'dashed'`, `'longdash'`, etc). * **`size`**: Grosor de la línea, se ingresa un número real. * **`color`**: Color de la línea, puede ser un color de R o un código hexadecimal. --- .large[**Ejemplo `geom_hline()`**] ```r ggplot(data=paises, aes(x=continente, y=esperanza_de_vida))+ geom_boxplot(aes(fill = continente)) + theme(legend.position = 'none', axis.title = element_blank()) + * geom_hline(yintercept = mean(paises$esperanza_de_vida), * linetype = 'dashed', * color = "red", * size = 1) ``` <img src="Clase-09---2024_files/figure-html/fig-horizontal-1.png" width="720" style="display: block; margin: auto;" /> --- .large[**Ejemplo `geom_vline()`**] ```r ggplot(data=paises, aes(x=pib_per_capita, y=esperanza_de_vida))+ geom_point(aes(color = continente)) + theme(legend.position = 'none') + * geom_vline(xintercept = quantile(paises$pib_per_capita), * size = 1.2, * color = * c("#bc5482","#b14575","#8c375d","#672945","#552139")) ``` <img src="Clase-09---2024_files/figure-html/fig-vertical-1.png" width="720" style="display: block; margin: auto;" /> --- # Añadir rectas El comando **`geom_abline()`** permite añadir todo tipo de rectas en un gráfico de **ggplot2**. Este recibe dos argumentos: * **`intercept`**: Número indicando la constante de la recta a graficar. * **`slope`**: Número indicando la pendiente de la recta a graficar. Es decir, con el comando `geom_abline(intercept = c, slope = m)` al gráfico se agregará la recta `\(y = m\cdot x + c\)`, donde `\(x\)` e `\(y\)` corresponden a los ejes del gráfico. La función **`geom_abline()`** también contiene los argumentos `linetype`, `color` y `size`. --- .large[**Rectas con `geom_abline()`**] ```r ggplot(data = mtautos, aes(x=millas, y=velocidad))+ geom_point(size = 3, shape = 21, fill = "turquoise") + * geom_abline(intercept = 25, slope = -0.3, color = "red") + * geom_abline(intercept = 7, slope = 0.5, color = "blue") ``` <img src="Clase-09---2024_files/figure-html/fig-recta-1.png" width="648" style="display: block; margin: auto;" /> --- # Añadir líneas suavizadas El comando **stat_smooth()** permite agregar ajustes de modelos a los datos. En este caso el modelo de Regresión Lineal nos entrega una recta de manera automática al añadir el argumento `method = "lm"`. Por defecto este comando entrega bandas de confianza del ajuste de la regresión, dadas por el error estándar del ajuste. Estas pueden ser desactivadas con el argumento `se = FALSE` --- .large[**Recta de regresión lineal con `stat_smooth()`**] ```r ggplot(data = mtautos, aes(x=millas, y=velocidad))+ geom_point(size = 3, shape = 21, fill = "turquoise") + * stat_smooth(method = "lm", se = F) ``` <img src="Clase-09---2024_files/figure-html/fig-regl-1.png" width="648" style="display: block; margin: auto;" /> --- .large[**Ajuste loess con `stat_smooth()`**] ```r ggplot(data = mtautos, aes(x=millas, y=velocidad))+ geom_point(size = 3, shape = 21, fill = "turquoise") + * stat_smooth(method = "loess", se = T) ``` <img src="Clase-09---2024_files/figure-html/fig-regl2 -1.png" width="648" style="display: block; margin: auto;" /> --- name: texto # Añadir texto a los gráficos .large[**Comando `geom_text`**] El comando `geom_text` es la herramienta base utilizada para incluir texto en los gráficos de `ggplot2` esto mediante dos funciones: * **`geom_text`**: Incluye texto a un gráfico de `ggplot2`. * **`geom_label`**: Incluye un texto con un cuadro de fondo a un gráfico de `ggplot2`. .large[**Librería `ggrepel`**] La librería `ggrepel` contine funciones que permiten incluir texto a un gráfico de `ggplot2`. A diferencia de las funciones anteriores estas contienen funcionalidades que permiten que el texto no se superponga entre si o con elementos gráficos. Esta librería contiene principalmente las siguientes funciones: * **`geom_text_repel`**: Incluye texto a un gráfico de `ggplot2`. * **`geom_label_repel`**: Incluye un texto con un cuadro de fondo a un gráfico de `ggplot2`. Tantos las funciones bases como las de `ggrepel` pueden agregar elementos de texto sueltos o variables de la base de datos dentro del comando `aes()`. --- # Elementos únicos de texto ```r ggplot(data=mtautos, aes(x=peso, y=millas)) + geom_point(color = "darkgreen", alpha = 0.5) + * geom_text(x = 3.5, y = 20, label = "Texto de prueba", * color = "black",stat = "unique", size = 10) ``` .pull-left[ Para ingresar texto de manera independiente en el gráfico se tienen que indicar los siguientes argumentos: * **x**,**y**: Coordenadas del texto. * **label**: Texto a ingresar. * **color**: Color del texto. * **size**: Tamaño del texto. * **stat = "unique"**: Argumento para ingresar sólo una vez el texto. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/texto0-out-1.png" width="100%" /> ] --- # Elementos únicos de texto ```r ggplot(data=mtautos, aes(x=peso, y=millas)) + geom_point(color = "darkgreen", alpha = 0.5) + * geom_label(x = 3.5, y = 20, label = "Texto de prueba", * color = "black",stat = "unique", size = 10) ``` .pull-left[ Para ingresar texto de manera independiente en el gráfico se tienen que indicar los siguientes argumentos: * **x**,**y**: Coordenadas del texto. * **label**: Texto a ingresar. * **color**: Color del texto. * **size**: Tamaño del texto. * **stat = "unique"**: Argumento para ingresar sólo una vez el texto. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/texto01-out-1.png" width="100%" /> ] --- .large[**Ejemplo `geom_text()`**] ```r ggplot(data = america07, aes(x = pib_per_capita, y = esperanza_de_vida)) + geom_point(size=4, alpha=0.3, col = "darkblue") + geom_text(aes(label = pais)) ``` <img src="Clase-09---2024_files/figure-html/figtexto-1.png" width="648" style="display: block; margin: auto;" /> --- .large[**Ejemplo `geom_text_repel()`**] ```r ggplot(data = america07, aes(x = pib_per_capita, y = esperanza_de_vida)) + geom_point(size=4, alpha=0.3, col = "darkblue") + ggrepel::geom_text_repel(aes(label = pais)) ``` <img src="Clase-09---2024_files/figure-html/figtexto2-1.png" width="648" style="display: block; margin: auto;" /> --- name: plotly # Package `plotly` La librería `plotly` permite entregarle interactividad a los gráficos de `ggplot2`. Esto se hace con el comando `ggplotly`: ```r plotly::ggplotly( grafico_ggplot2 ) ``` Por defecto el comando `ggplotly` recibe como argumento `ggplot2::last_plot()`, esto entrega sin necesidad de definir un objeto la verisón interactiva del último gráfico de `ggplot2` ejecutado en la sesión actual. --- name: gganimate # Gráficos animados con `gganimate` La librería `gganimate` permite animar nuestros gráficos de `ggplot2`, generando un archivo animado en formato `.gif`. .pull-left[ <img src="Clase-09---2024_files/figure-html/unnamed-chunk-3-1.png" width="504" /> ] .pull-right[ <!-- --> ] .footnote[__Ejemplo de __ https://www.datanovia.com/en/blog/gganimate-how-to-create-plots-with-beautiful-animation-in-r/] --- # Gráficos animados con `gganimate` Para que la animación funcione correactamente tenemos que tener las librerías `gganimate` y `gifski` instaladas en la sesión. La animación se genera a través de comandos de __transición__ que permiten determinar como y sobre que variable se animará el gráfico. Algunas de ellas son: - **`transition_reveal`** : Los datos aparecen gradualmente basados en una variable de tiempo, este genera una transición suave al calcular los valores en los puntos intermedios. - **`transition_states`** : Se dividen los datos en distintos estados, basándose en los niveles de una variable, despúes se genera un gráfico que transiciona entre estos niveles pausando un tiempo en cada estado. La animación más simple se realiza con un gráfico de ggplot más un comando de transición dentro de la variable `animate()`, de la siguiente forma: ```r animate(grafico_ggplot + transition_*(variable)) ``` Al igual que en las funciones de `ggplot2`, en `gganimate` existen funciones extras que permiten modificar la animación de las funciones. --- ```r plot_1 = ggplot(data = base_vecinos, aes(x = anio, y = esperanza_de_vida, color = pais) ) + geom_line(size = 1) plot_1 ``` <img src="Clase-09---2024_files/figure-html/fig_legend1-1.png" width="720" style="display: block; margin: auto;" /> --- ```r animate(plot_1 + * transition_reveal(anio)) ``` <img src="Clase-09---2024_files/figure-html/fig_animate_1-1.gif" style="display: block; margin: auto;" /> --- ```r animate(plot_1 + * geom_point(size=3) + transition_reveal(anio)) ``` <img src="Clase-09---2024_files/figure-html/fig_animate_2-1.gif" style="display: block; margin: auto;" /> --- ```r animate(plot_1 + * geom_point(aes(group = seq_along(anio)), size = 2) + transition_reveal(anio) ) ``` <img src="Clase-09---2024_files/figure-html/fig_animate_3-1.gif" style="display: block; margin: auto;" /> --- ```r plot_3 = ggplot(paises, aes(x = pib_per_capita, y = esperanza_de_vida, color = continente)) + geom_point(size=5, alpha=0.5) + labs(x = "PIB per cápita (en dólares)", y = "Esperanza de vida (en años)", title = "Esperanza de vida dado PIB pér cápita", subtitle = "Diferenciado según continente") plot_3 ``` .pull-left[ El estado actual de esta visualización no permite distinguir los puntos del continente de Oceanía. Es de interés definir una animación en donde los puntos aparezcan agrupados por continente. Además, sería ideal que los puntos de los continentes anteriores no afecten la visibilidad de las nuevos puntos, esto permitiría ilustrar tanto los datos de los continentes y las diferencias entre estos. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/animate1-out-1.png" width="100%" /> ] --- ```r animate(plot_3 + transition_states(continente,transition_length = 1, state_length = 2) + shadow_mark(alpha=0.3, size=2) + enter_fade()+ exit_shrink()) ``` .pull-left[ * En el comando **transition_states()** se define el tiempo de transición y el tiempo de permanencia en cada estado. * El comando **shadow_mark()** deja un rastro de los estados anteriores, en él definimos el tamaño y la trasparencia con la que queremos dejar estos puntos. * El comando **enter_fade()** entrega una animación de entrada a los nuevos estádos. * El comando **exit_shrink()** entrega una animación de encogida de los puntos a la salida de los estados. ] .pull-right[ <img src="Clase-09---2024_files/figure-html/animate2-out-1.gif" width="100%" /> ] --- name: adios # Referencias y material complementario * [**Link**: Anotaciones de texto con `geom_text` (r-charts.com)](https://r-charts.com/es/ggplot2/anotaciones-texto/) * [**Link:** Ejemplos y funcionalidades `ggpairs` (r-graph-gallery.com)](https://www.r-graph-gallery.com/199-correlation-matrix-with-ggally.html) .large[**Añadir lineas, segmentos, distribuciones**] * [**Link:** Líneas rectas, horizontales, verticales.](http://www.sthda.com/english/wiki/ggplot2-add-straight-lines-to-a-plot-horizontal-vertical-and-regression-lines) * [**Link:** Líneas distribuciones.](https://stackoverflow.com/questions/5688082/overlay-histogram-with-density-curve) --- class: middle, inverse background-image: url(Figuras/fondo.jpg) background-size: cover .pull-left[ # **¡Gracias!** <br/> <br/> ## Ana María Alvarado ### amalvara@uc.cl ]