class: center, middle, inverse, title-slide <style type="text/css"> .remark-slide table{ border: none } .remark-slide-table { } tr:first-child { border-top: none; } tr:last-child { border-bottom: none; } </style> <style type="text/css"> /* THIS IS A CSS CHUNK - THIS IS A COMMENT */ /* Size of font in code echo. E.g. 10px or 50% */ .remark-code { font-size: 70%; } /* Size of font in text */ .medium-text { font-size: 75%; } /* Size of font in tables */ .small-table table { font-size: 6px; } .medium-table table { font-size: 8px; } .medium-large-table table { font-size: 10px; } </style> # Introducción a R para la epidemiología aplicada ### {ggplot2} - Escalas, temas y etiquetas [contact@appliedepi.org](mailto:contact@appliedepi.org) --- # Gramática de los gráficos ## Volvamos a la secuencia que construye un ggplot. El orden de las capas suele ser el siguiente: 1) **"Abrir" el gráfico** -- 2) **"Mapear" columnas de datos** -- 3) **Añade (`+`) "capas "geom** -- 4) **Modificar "escalas"** como la escala de color o los saltos del eje y -- 5) **Añade elementos "temáticos" al diseño de el gráfico** como etiquetas de ejes, título, leyenda, fuentes, tamaños de texto, temas de fondo o rotación de ejes ??? Recuerda que aunque los comandos sean largos, es infinitamente más fácil editar y reciclar que en Excel --- class: inverse, center, middle ## Escalas en {ggplot2} <img src="../../images/ggplot_scales_themes/scales.png" width="50%" /> --- # Escalas - visión general Los comandos de Escala sustituyen a los valores por defecto de cómo se muestra la estética, por ejemplo: - *Qué* colores o formas mostrar - *Cómo* se escriben la fecha o las proporciones en las etiquetas de los ejes - El mín/máx y la frecuencia de las interrupciones de los ejes -- <h4>Fórmula genérica: <span style="color:darkgreen">scale</span>_<span style="color:cornflowerblue">aesthetic</span>_<span style="color:deeppink">method</span>()</h4> -- <h4>1) <span style="color:darkgreen">scale</span>_ : este prefijo nunca cambia</h4> -- -- <h4>3) <span style="color:deeppink">method</span>: _continuous() o _discrete() или _manual() o _date() etc.</h4> -- <h4><span style="color:darkgreen">scale</span>_<span style="color:cornflowerblue">color</span>_<span style="color:deeppink">continuous</span>()</h4> <h4><span style="color:darkgreen">scale</span>_<span style="color:cornflowerblue">x</span>_<span style="color:deeppink">date</span>()</h4> <h4><span style="color:darkgreen">scale</span>_<span style="color:cornflowerblue">x</span>_<span style="color:deeppink">manual</span>()</h4> --- # Ejemplos de escalas Algunos ejemplos de comandos de escala: | Quieres ajustar | Comando Escala | | ----------------------------------------------- | ------------------ | | eje y continuo | `scale_y_continuous()` | | fecha eje x | `scale_x_date()` | | eje x categórico | `scale_x_discrete()` | | relleno, continuo | `scale_fill_continuous()` | | relleno, continuo | `scale_fill_gradient()` | | color, asignación manual | `scale_color_manual()` | --- # Escalas - por defecto .pull-left[ ```r ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() ``` Más arriba, el relleno de un gráfico de barras utiliza la función **colores por defecto y los saltos de eje**: ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-26-1.png" width="504" /> ] ??? Ignora las etiquetas superpuestas del eje x, por simplicidad de código no las ajustamos en esta diapositiva. --- # Balanzas - relleno ajustado .pull-left[ ```r ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + *scale_fill_manual( * values = c( * "hombre" = "violetred", * "mujer" = "aquamarine")) ``` En `scale_fill_manual()` proporcionamos **manual** tareas dentro de un vector `c()`. .footnote[Utilizar *na.value = "gris"* para valores perdidos ] ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-28-1.png" width="504" /> ] ??? Discute los argumentos na.value= en la mayoría de los comandos de escala, y la diferencia entre tener valores NA en los datos y tener un valor omitido explícito como "Desconocido". --- # Escalas - colorbrewer .pull-left[ ```r ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + *scale_fill_brewer( * type = "qual", * na.value = "grey50") ``` Escalas - colorbrewer .footnote[Usar *na.value = "gris"* para valores perdidos ] ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-30-1.png" width="504" /> ] ??? Menciona brevemente `na.value=` de la mayoría de los comandos de escala, y la diferencia entre tener valores NA en los datos y tener un valor omitido explícito como "Desconocido". --- # Escalas - eje y ajustado .pull-left[ ```r ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_manual( values = c( "hombre" = "violetred", "mujer" = "aquamarine")) + *scale_y_continuous( * breaks = seq(from = 0, * to = 250, * by = 10)) ``` En `scale_y_continuous()` ajustamos los saltos del eje y utilizando `seq()` para definir una secuencia numérica. ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-32-1.png" width="504" /> ] --- # Escalas - inicia los ejes en 0 .pull-left[ ```r ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_manual( values = c( "hombre" = "violetred", "mujer" = "aquamarine")) + scale_y_continuous( breaks = seq(from = 0, to = 250, by = 10), * expand = c(0, 0)) + *scale_x_discrete( * expand = c(0, 0)) ``` En `scale_x_` o `scale_y_` utiliza `expand = c(0,0)` para eliminar el espacio sobrante alrededor de el gráfico. ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-34-1.png" width="504" /> ] --- # Escalas - etiquetas de los ejes de fecha .pull-left[ ```r ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram() ``` La escala por defecto para los ejes de fecha variará según el rango de tus datos. ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-36-1.png" width="504" /> ] --- # Escalas - roturas de etiquetas de fecha .pull-left[ ```r ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram() + *scale_x_date( * date_breaks = "2 months") #2 meses ``` Ajusta las etiquetas de los ejes con `scale_x_date()`. Utiliza `date_breaks=` valores como "1 semana", "2 semanas" o "3 meses". Estos ajustan la ruptura del eje *etiquetas* y no los intervalos del histograma. ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-41-1.png" width="504" /> ] ??? Para obtener consejos sobre los intervalos de geom\_histogram(), consulta la página epicurvas del Manual de Epi R --- # Escalas - etiquetas de los ejes de fecha .pull-left[ ```r ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram() + scale_x_date( date_breaks = "2 months", * date_labels = "%d %b\n%Y") ``` Especifica el formato de la etiqueta de fecha para `date_labels=` utilizando ["sintaxis "strptime](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/strptime) `"%d %b %Y"` para DD MM AAAA. .footnote[Ver Manual Epi R [Epicurves](https://epirhandbook.com/epidemic-curves.html) y [Cuerdas](https://epirhandbook.com/characters-and-strings.html) capítulos ] ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-43-1.png" width="504" /> ] ??? /n es una nueva línea --- # Escalas - etiquetas autoeficaces .pull-left[ ```r ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram() + scale_x_date( * date_breaks = "2 weeks", #2 semanas * labels = label_date_short() ) ``` O, simplemente, asigna `labels=` a `label_date_short()` desde [{scales}](https://scales.r-lib.org/) El año no se repite en cada etiqueta. ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-48-1.png" width="504" /> ] --- class: inverse, center, middle ## Etiquetas en {ggplot2} <img src="../../images/ggplot_scales_themes/labels.png" width="50%" /> --- # Etiquetas de parcela .pull-left[ ```r ggplot( data = vig, mapping = aes( x = fecha_sintomas, fill = hospital)) + geom_histogram() + scale_x_date( date_breaks = "2 weeks", labels = label_date_short() )+ scale_fill_brewer(type = "qual", na.value = "grey50") ``` ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-51-1.png" width="504" /> ] --- # Etiquetas de parcela .pull-left[ ```r ggplot( data = vig, mapping = aes( x = fecha_sintomas, fill = hospital)) + geom_histogram() + scale_x_date( date_breaks = "2 weeks", labels = label_date_short() )+ scale_fill_brewer(type = "qual", na.value = "grey50")+ *labs( * title = "Curva epidémica del brote de ébola", * subtitle = "Casos confirmados, 2014", * x = "Fecha", * y = "Número de casos", * caption = "Datos ficticios sobre el ébola", * fill = "Hospital" ) + ``` Utiliza `labs()` como arriba. Nota: edita el título de la leyenda mediante la estética que creó la leyenda (por ejemplo `fill=`). ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-59-1.png" width="504" /> ] --- # Etiquetas dinámicas Incrustar código dentro `str_glue("text here {CODE HERE} text here")` El código se actualizará con los datos. ```r str_glue("Datos a partir de {Sys.Date()}") ``` -- ```r str_glue("{fmt_count(vig, is.na(fecha_sintomas))} casos sin fecha de inicio síntomas") ``` ``` ## 33 (5.2%) casos sin fecha de inicio síntomas ``` .footnote[Ver el [capítulo sobre cadenas del Manual de Epi](https://epirhandbook.com/characters-and-strings.html#dynamic-strings) y el capítulo {stringr} paquete. ] ??? Explica que en str\_glue, todo lo que esté entre llaves se ejecutará como código R. --- class: inverse, center, middle ## Temas en {ggplot2} <img src="../../images/ggplot_scales_themes/themes.png" width="50%" /> --- # Temas Los temas son **sin datos** de diseño, por ejemplo: - Fondo del lienzo del gráfico - Tamaño, color y orientación del texto - Posición de la leyenda -- El poder de {ggplot2} - puedes hacer ajustes extremadamente pequeños ... si quieres. --- # Temas .pull-left[ ["Temas completos"](https://ggplot2.tidyverse.org/reference/ggtheme.html) son fáciles de añadir. ```r # Prueba uno de estos... theme_minimal() theme_light() theme_bw() theme_gray() theme_dark() theme_void() theme_classic() ``` Prueba el argumento `base_size = 16` para aumentar rápidamente el tamaño del texto. ] .pull-right[ <img src="intro05-2_es_files/figure-html/unnamed-chunk-73-1.png" width="504" /> ] --- # Microajustes Realiza microajustes dentro de `theme()`. Proporciona argumentos para cada pequeño cambio que quieras hacer, por ejemplo: | Componente del gráfico | Argumento temático | | ----------------------------------------------- | ------------------ | | posición de la leyenda | `legend.position = ` | | dirección de la leyenda (horizontal o vertical) | `legend.direction = ` | -- Pueden ser *muy muy* específicos: | Componente de el gráfico | Argumento temático | | ----------------------------------------------- | ------------------ | | Longitud de las marcas del eje X | `axis.ticks.length.x = ` | Hay literalmente cientos de opciones. ??? Piensa en todos los minúsculos ajustes que haces al crear un gráfico en Excel. ¿Cuántas veces tienes que rehacer todos esos pasos? Todos esos pasos pueden codificarse, lo que hace que el gráfico sea ajustable. --- # Temas .pull-left[ Realiza microajustes dentro de `theme()`. ```r ggplot( data = vig, mapping = aes( x = edad_anios, y = alt_cm, color = sexo), alpha = 0.3) + geom_point() + labs( title = "Altura por edad", x = "Edad (años)", y = "Altura (cm)", color = "Género")+ theme_minimal(base_size = 16) + *theme( * legend.position = "bottom", * plot.title = element_text( * color = "red", * face = "bold"), * axis.title.y = element_text(angle = 90)) ``` ] .pull-right[ La sintaxis requiere práctica - véase [esta lista](https://ggplot2.tidyverse.org/reference/theme.html) de argumentos específicos de cada función. <img src="intro05-2_es_files/figure-html/unnamed-chunk-81-1.png" width="504" /> ] ??? Habla de estos argumentos de theme() y de cómo constan de dos partes, igual que `mapping = aes()`. Explica que nadie los tiene todos memorizados, pero que los más comunes son fáciles de recordar una vez que los utilizas lo suficiente. Recuerda añadirlos DESPUÉS de los temas completos. --- # Temas - `element_text()` Si cambias *texto* a menudo hay que hacer microajustes *en* `element_text()` ```r theme( legend.position = "bottom", * plot.title = element_text( * color = "red", * face = "bold"), * axis.title.y = element_text(angle = 90)) ``` Es una sintaxis similar a `mapping = aes()` ??? Habla de estos argumentos de theme() y de cómo constan de dos partes, igual que `mapping = aes()`. Explica que nadie los tiene todos memorizados, pero que los más comunes son fáciles de recordar una vez que los utilizas lo suficiente. --- class: inverse, center, middle ## ¡Ejercítate! Ir al sitio web del curso Abre el ejercicio del Módulo 5 parte 2, e inicia sesión Sigue las instrucciones para continuar codificando en tu proyecto R "ébola Avisa a un instructor si no estás seguro de lo que tienes que hacer <img src="../../images/breakout/teamwork3.png" width="50%" />