class: center, middle, titular background-size: contain <img src="img/see.png" width="250px"/> # Sección 6: Gráficos con `ggplot2` ## **PROGRAMA INTERNACIONAL DE ESTADÍSTICA APLICADA A LA INVESTIGACIÓN CIENTÍFICA** #### MÓDULO: SOFTWARES PARA EL MANEJO DE DATOS <br> <br> Linda Cabrera Orellana #### Marzo, 2023 --- class: middle, center, inverse <img src="img/ggplot2.png" width="150px"> # Creación de gráficos con `ggplot2` --- class: middle, center <img src="img/ggplot2_EDA.png" width="400px"> ## ¿Qué es `ggplot2`? `ggplot2` es un paquete R potente y flexible, implementado por Hadley Wickham, para producir gráficos elegantes. El `gg` en `ggplot2` significa Grammar of Graphics, un concepto gráfico que describe tramas usando una "gramática". --- background-image: url("img/ggplot2_grammar2.png") background-size: contain --- #
Gramática de los gráficos - **Data o ggplot():** especificar los datos sin procesar que desea trazar. - **Geometrías `geom_*:`** formas geométricas que representarán los datos (histogramas, gráficos de barras, etc.). - **Estética `aes()`:** usado para indicar las variables `\(x\)` y `\(y\)`. También puede ser usado para controlar la posición, color, tamaño, forma y transparencia. Otras capas que pueden ayudar a mejorar tus gráficos son: - **Facetas `facet_`:** disposición de los datos en una cuadrícula de gráficos. - **Escalas `scale_`:** asignaciones entre los datos y las dimensiones estéticas, como el rango de datos para trazar el ancho o los valores de los factores para los colores. - **Sistema de coordenadas `coord_`:** transformación utilizada para mapear coordenadas de datos en el plano del rectángulo de datos. - **Transformaciones estadísticas `stat_`:** resúmenes estadísticos de los datos, como cuantiles, curvas ajustadas y sumas. - **Temas visuales `theme()`:** los valores predeterminados visuales generales de una trama, como el fondo, las cuadrículas, los ejes, el tipo de letra predeterminado, los tamaños y los colores. .footnote[ [Referencias de ggplot2](https://ggplot2.tidyverse.org/reference/) | [ggplot2.tidyverse.org](https://ggplot2.tidyverse.org/) ] --- #
Data .pull-left[ Un **ggplot** necesita especificar mínimo tres cosas: los datos, la estética y una geometría. Siempre comenzamos a definir un objeto de trazado llamando a la **data** mediante `data %>% ggplot()` que simplemente le dice a `ggplot2` que vamos a trabajar con esos datos. Primero, cargamos el paquete `ggplot2` que es parte del `tidyverse`. ```r ## cargamos la librería library(ggplot2) ## mapeamos la primera capa profesores %>% ggplot() ``` ] .pull-right[ <!-- --> ] --- #
Estética .pull-left[ **Aesthetics** o **Estética** significa describir un objeto en nuestros gráficos. Sin estética no tenemos nada que mostrar en nuestros gráficos. Depende del tipo de gráfico estadístico que estemos produciendo generalmente mapeamos: * una variable que se mostrará en el eje `\(x\)` * una variable que se mostrará en el eje `\(y\)` (en algunos casos solo necesitamos mapear a un solo eje) * se pueden asignar otras variables al color, la forma, el tamaño, el color de relleno, etc. del objeto. Para especificar la estética, agregamos `aes(x = var1, y = var2)` a la llamada **ggplot()**. Sin embargo, también hay casos en los que hay que especificar una o incluso tres o más variables. ```r profesores %>% ggplot(aes(edad)) ``` ] .pull-right[ <!-- --> ] --- #
Geometrías .pull-left[ Hay muchas geometrías diferentes que se pueden agregar a un gráfico ggplot de forma predeterminada. Estas geometrías son llamadas **geoms** porque cada función generalmente comienza con `geom_*`. Tenemos que decirle a `ggplot2` qué estilo queremos usar, por ejemplo, agregando geom_bar() para crear un diagrama de barras que es usado para representar datos discretos, como en este caso, la edad de los encuestados. Para separar las capas de los gráficos de ggplot2 usaremos el operador `+`, en lugar del pipe. ```r profesores %>% ggplot(aes(edad)) + geom_bar() ``` ] .pull-right[ <!-- --> ] --- background-image: url("img/aesthetics2.png") background-size: contain --- background-image: url("img/geoms2.png") background-size: contain --- #
Facetas .pull-left[ Las facetas dividen un conjunto en subconjuntos basados en los valores de uno o más **variables categóricas**. Los datos se dividen en **grupos** (facetas) y los datos se trazan en sus propios gráficos usando el mismo sistema de coordenadas. Tenemos dos opciones al generar facetas: * Gráfico dividido según filas y columnas: `facet_grid()` * Envolver subconjuntos en columnas: `facet_wrap()` ```r ## divido el conjunto formando columnas profesores %>% ggplot(aes(edad)) + geom_bar() + facet_grid(.~nivel) ``` ] .pull-right[ <!-- --> ] --- background-image: url("img/facet2.png") background-size: contain --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA --- #
Práctica: ¡3 minutos! 1. Recree el código R necesario para generar el siguiente gráfico: <!-- --> --- #
Más Estética .pull-left[ Los gráficos pueden tener más de una **geometría**, en este caso tienen un gráfico de dispersión (`geom_point()`) y de forma superpuesta un gráfico de líneas suavizadas (`geom_smooth()`). Ambos gráficos necesitan de dos variables numéricas, en este caso, utilizamos la edad representado en el eje `\(x\)` y el tiempo de docencia representado en el eje `\(y\)`. ```r profesores %>% ggplot(aes(x=edad, y=tiempo)) + geom_point() + geom_smooth() ``` ] .pull-right[ <!-- --> ] --- #
Más Estética .pull-left[ Podemos visualizar más variables en las geometrías, agregando atributos **aesthetics** en la geometría. En este caso agregamos `color` a los puntos según el sexo y la forma (`shape`) de los puntos según el nivel en que imparten docencia. ```r profesores %>% ggplot(aes(x=edad, y=tiempo)) + geom_point(aes(color = sexo, shape = nivel)) + geom_smooth() ``` ] .pull-right[ <!-- --> ] --- #
Transformaciones estadísticas **Stats** son métodos que alteran la posición de las geometrías. Podemos representar más de una estadística en una figura. La capa de **Stats** representa una forma alternativa de crear una capa, ya que es una transformación del conjunto de datos original. Los métodos estadísticos más importantes disponibles para los gráficos se dividen en cinco clases: * **bin** (particiones y mallas - para histogramas) * **summary** (estadísticas básicas: media, mediana, desviación, …) * **region** (límites de intervalo y región) * **smooth** (regresión, smoothing, interpolación y estimación de densidad) * **link** (métodos para calcular bordes de gráficos basados en un conjunto de nodos o puntos) --- #
Transformaciones estadísticas Hay docenas de capas de **Stats** especificadas con un `stat_function`. La mayoría de los geoms y las estadísticas vienen en pares que casi siempre se usan en conjunto como se muestra en la siguiente tabla: .pull-left[ | geometría | estadístico | |---------------------|---------------------| | `geom_bar()` | `stat_count()` | | `geom_point()` | `stat_identity()`, `stat_sum()` | | `geom_line()` | `stat_identity()` | | `geom_bin2d()` | `stat_bin_2d()` | | `geom_boxplot()` | `stat_boxplot()` | | `geom_contour()` | `stat_contour()` | | `geom_count()` | `stat_sum()` | | `geom_density()` | `stat_density()` | | `geom_density_2d()` | `stat_density_2d()` | ] .pull-right[ | geometría | estadístico | |---------------------|---------------------| | `geom_hex()` | `stat_hex()` | | `geom_freqpoly()` | `stat_bin()` | | `geom_histogram()` | `stat_bin()` | | `geom_qq_line()` | `stat_qq_line()` | | `geom_qq()` | `stat_qq()` | | `geom_quantile()` | `stat_quantile()` | | `geom_smooth()` | `stat_smooth()` | | `geom_violin()` | `stat_violin()` | | `geom_sf()` | `stat_sf()` | ] --- #
Transformaciones estadísticas .pull-left[ Observaremos las diferencias entre gráficos que muestran datos tal como lucen y gráficos que muestran datos transformados. Graficamos un gráfico de dispersión `geom_point()`, gráfico de líneas `geom_line()` y gráfico de líneas suavizadas `geom_smooth()` con el conjunto de datos `profesores`. ```r profesores %>% ggplot(aes(x=edad, y=tiempo)) + geom_point() + geom_line() + geom_smooth() ``` ] .pull-right[ <!-- --> ] --- #
Transformaciones estadísticas .pull-left[ Cada `geom_` tiene por default un `stat` (pag.18), argumento que me sirve para convertir un gráfico que muestra datos como son a un gráfico de datos transformados. Si utilizamos solo `geom_point()`, veremos que se forman puntos por la intersección de la edad y el tiempo de docencia de cada encuestado. Cuando incluimos `stat = "identity"` en el `geom_point()` no ocurre ninguna modificación porque "identity" muestra los datos como son. ```r ## geom_point() con stat = "identity" profesores %>% ggplot(aes(x=edad, y=tiempo)) + geom_point(stat = "identity") ``` ] .pull-right[ <!-- --> ] --- #
Transformaciones estadísticas .pull-left[ Por el contrario, cuando incluimos `stat = "smooth"` en el `geom_point()` la ubicación de cada observación (cada punto) se transforma y toma la forma de la línea suavizada que indica la tendencia de los puntos porque "smooth" muestra los datos transformados en una línea suavizada. ```r ## geom_point() con stat = "smooth" profesores %>% ggplot(aes(x=edad, y=tiempo)) + geom_point(stat = "smooth") ``` ] .pull-right[ <!-- --> ] --- #
Transformaciones estadísticas .pull-left[ Si utilizamos solo `geom_smooth()`, veremos que se forma una línea de tendencia de las observaciones generadas por la intersección de la edad y el tiempo de docencia de cada encuestado. Cuando incluimos `stat = "identity"` en el `geom_smooth()` la línea de tendencia se transforma y toma la forma de los puntos como si graficara un `geom_point()` pero unido por líneas, esto es porque, aunque `geom_smooth` transforma datos, el "identity" muestra los datos como son. ```r ## geom_smooth() con stat = "identity" profesores %>% ggplot(aes(x=edad, y=tiempo)) + geom_smooth(stat = "identity") ``` ] .pull-right[ <!-- --> ] --- #
Transformaciones estadísticas .pull-left[ También cada `stat` tiene por default un `geom_`, por ejemplo podemos hacer un gráfico de barras con `geom_bar()` y con `stat_count()`. ```r ## Gráfico de barras usando geom_bar() profesores %>% ggplot(aes(edad)) + geom_bar() ## Gráfico de barras usando stat_count() profesores %>% ggplot(aes(edad)) + stat_count() ``` ] .pull-right[ <!-- --> ] --- #
Coordenadas Son conjuntos que ubican puntos en el espacio. Generalmente, vemos las coordenadas como esquemas para mapear elementos de conjuntos para objetos geométricos. Las coordenadas más conocidas son las **coordenadas cartesianas**, donde el punto es ubicado en un plano cartesiano por su distancia a dos rectas que se cortan. Hay diferentes **sistemas de coordenadas**. ¿Por qué usar diferentes sistemas? Una razón es simplificar la visualización de gráficos. Las transformaciones de coordenadas pueden cambiar algunos gráficos curvilíneos a lineales. `ggplot2` proporciona diferentes sistemas de coordenadas aparte del sistema de coordenadas cartesianas. --- background-image: url("img/coordinate2.png") background-size: contain --- #
Coordenadas .pull-left[ ```r ## geom_bar() con coord_flip profesores %>% ggplot(aes(edad)) + geom_bar() + coord_flip() ``` <!-- --> ] .pull-right[ ```r ## geom_bar() con coord_polar profesores %>% ggplot(aes(edad)) + geom_bar() + coord_polar() ``` <!-- --> ] --- #
Escalas Las **escalas** controlan los detalles de cómo los valores de los datos se traducen en propiedades visuales. Podemos anular las escalas predeterminadas para ajustar detalles como etiquetas de eje o claves de leyenda, o usar una traducción completamente diferente de datos a estética. En general, podemos usar escalas para: * modificar etiquetas de ejes, leyendas y gráficos, * escalas de uso general, * escalas de ubicación, * escalas de color y relleno, * escalas de forma, * escalas de tamaño, entre otras... --- #
Escalas .pull-left[ ## Escalas de ubicación `\(X\)` y `\(Y\)` Usar con la estética de `\(x\)` o `\(y\)`: * `scale_x_log10()` o `scale_y_log10()` - grafica `\(x\)` o `\(y\)` en escala logarítmica * `scale_x_date()` o `scale_y_date()` - trata valor de `\(x\)` o `\(y\)` como fechas * `scale_x_sqrt()` o `scale_y_sqrt()` - grafica `\(x\)` o `\(y\)` en escala de raíz cuadrada ] .pull-right[ ## Escalas de color y relleno Escalas de color para valores discretos y valores continuos. Para valores discretos: * `scale_fill_brewer()` * `scale_fill_grey()` Para valores continuos: * `scale_fill_gradient()` * `scale_fill_gradient2()` ] --- #
Temas visuales El tema se usa para controlar todos los elementos que no son datos en la trama. **ggplot2** proporciona valores predeterminados para la capa del tema (puede dejarlo como está) o puede anular el tema predeterminado, por ejemplo, con: - **theme_bw()** tema en blanco y negro - **theme()** función para ajustar la configuración de temas individuales - **element_** crea funciones para modificar la configuración del tema .pull-left[ Temas completos: `theme_grey()` `theme_bw()` `theme_light()` `theme_dark()` `theme_classic()` `theme_void()` ] .pull-right[ Elementos de un tema: `margin()` `element_blank()` `element_rect()` `element_line()` `element_text()` ... ] --- background-image: url("img/theme.png") background-size: contain --- #
Temas visuales .pull-left[ <img src="6_Graficos_con_ggplot2_2E_files/figure-html/theme1-1.png" width="100%" style="display: block; margin: auto;" /> ] .pull-right[ ```r profesores %>% ggplot(aes(x = nivel, fill = nivel)) + geom_bar() + scale_fill_brewer(palette = "Accent") + labs(x = "Nivel de docencia", y = "Cantidad de encuestados", title = "Cantidad de encuestados según el nivel de docencia n el que imparte clases", subtitle = "Encuesta de situación actual de profesorado de alumnos con NEE", fill = "Nivel de docencia", caption = "Fuente: profesores") + theme_minimal() + theme(legend.position = "bottom") ``` ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA --- #
Práctica: ¡5 minutos! 1. Construir un gráfico de acuerdo a la gramática de los gráficos de `ggplot2`. 2. Guarda el gráfico en tu computadora en un archivo de extensión `.png`. --- #
Algunos sitios de interés * [Códigos visualizaciones desafío #30díasdegráficos](https://github.com/sporella/nightingale) * [#30DayMapChallenge](https://github.com/sporella/30daymap) * [Gráficos Estadísticos con R](https://cran.r-project.org/doc/contrib/grafi3.pdf) * [Gráficos avanzados con ggplot](https://rua.ua.es/dspace/bitstream/10045/69767/1/Modulo_4_-_Graficos_avanzados_con_ggplot2.pdf) * [Data Visualization. A practical introduction. De Kieran Healy](https://socviz.co/index.html#preface) --- class: middle, center, inverse <br> <br> # Gráficos con `ggplot2` ### Linda Cabrera Orellana .pull-left[ .center[ ### [@socecuest
](https://www.facebook.com/socecuest) ### [@see_estadistica
](https://www.instagram.com/see_estadistica/) ]] .pull-right[ .center[ ### [@see_estadistica
](https://twitter.com/see_estadistica) ### [@sosecuest
](https://t.me/sosecuest) ]]