# load packages ---------------------------------------------------------------- library(introexercises) library(learnr) library(gradethis) library(flair) library(dplyr) library(ggplot2) library(gghighlight) library(janitor) library(stringr) library(lubridate) library(epikit) library(fontawesome) library(scales) # library(RMariaDB) # connect to sql database ## set options for exercises and checking --------------------------------------- ## Define how exercises are evaluated gradethis::gradethis_setup( ## note: the below arguments are passed to learnr::tutorial_options ## set the maximum execution time limit in seconds exercise.timelimit = 60, ## set how exercises should be checked (defaults to NULL - individually defined) # exercise.checker = gradethis::grade_learnr ## set whether to pre-evaluate exercises (so users see answers) exercise.eval = FALSE ) # ## event recorder --------------------------------------------------------------- # ## see for details: # ## https://pkgs.rstudio.com/learnr/articles/publishing.html#events # ## https://github.com/dtkaplan/submitr/blob/master/R/make_a_recorder.R # # ## connect to your sql database # sqldtbase <- dbConnect(RMariaDB::MariaDB(), # user = Sys.getenv("userid"), # password = Sys.getenv("pwd"), # dbname = 'excersize_log', # host = "144.126.246.140") # # # ## define a function to collect datos # ## note that tutorial_id is defined in YAML # ## you could set the tutorial_version too (by specifying version:) but use package version instead # recorder_function <- function(tutorial_id, tutorial_version, user_id, event, datos) { # # ## define a sql query # ## first bracket defines variable names # ## values bracket defines what goes in each variable # event_log <- paste("INSERT INTO responses ( # tutorial_id, # tutorial_version, # date_time, # user_id, # event, # section, # label, # question, # answer, # code, # correct) # VALUES('", tutorial_id, "', # '", tutorial_version, "', # '", format(Sys.time(), "%Y-%M%-%D %H:%M:%S %Z"), "', # '", Sys.getenv("SHINYPROXY_PROXY_ID"), "', # '", event, "', # '", datos$section, "', # '", datos$label, "', # '", paste0('"', datos$question, '"'), "', # '", paste0('"', datos$answer, '"'), "', # '", paste0('"', datos$code, '"'), "', # '", datos$correct, "')", # sep = '') # # # Execute the query on the sqldtbase that we connected to above # rsInsert <- dbSendQuery(sqldtbase, event_log) # # } # # options(tutorial.event_recorder = recorder_function) Sys.setlocale("LC_ALL", "Spanish")
# hide non-exercise code chunks ------------------------------------------------ knitr::opts_chunk$set(echo = FALSE)
# datos prep -------------------------------------------------------------------- vig <- rio::import(system.file("dat/listado_vigilancia_limpio_20141201.rds", package = "introexercises"))
Bienvenido/a al curso "Introducción a R para epidemiología aplicada", ofrecido por Applied Epi - una organización sin ánimo de lucro y el principal proveedor de formación, apoyo y herramientas de R para profesionales de primera línea en salud pública.
knitr::include_graphics("images/logo.png", error = F)
Este ejercicio se centra en escalas y temas en {ggplot2}.
Este ejercicio te guía a través de las tareas que debes realizar en RStudio en tu ordenador.
Hay varias formas de obtener ayuda:
1) Busca la sección de ayuda (ver más abajo) 2) Pide ayuda a tu instructor/a o facilitador/a de tu curso en directo 3) Programa una llamada 1 a 1 con un/a instructor/a para "Tutoría del curso". 4) Publica una pregunta en la Comunidad de Applied Epi
Este es el aspecto que tendrán esa sección de ayuda:
r fontawesome::fa("lightbulb", fill = "gold")
Haz clic para leer una pista
¡Aquí verás una pista útil!
r fontawesome::fa("check", fill = "red")
Haz clic para ver una solución (¡pruébalo tú primero!)
linelist %>% filter( edad > 25, distrito == "Bolo" )
Aquí tienes más explicaciones sobre por qué funciona la solución.
Responder a las preguntas del cuestionario te ayudará a comprender el material. Las respuestas no se registran.
Para practicar, responde a las siguientes preguntas:
quiz( question_radio("¿Cuándo debería mirar las secciones de ayuda en rojo?", answer("Tras intentar escribir el código yo mismo", correct = TRUE), answer("Antes de intentar escribir el código", correct = FALSE), correct = "Revisar el código de ejemplo después de intentar escribirlo usted mismo puede ayudarle a mejorar", incorrect = "Por favor, intente completar el ejercicio usted mismo, o use las pistas disponibles, antes de mirar la respuesta." ) )
question_numeric( "¿Qué tan preocupado/a estás ante la idea de empezar este tutorial - en una escala de 1 (nada nervioso) a 10 (extremadamente preocupado/a)?", answer(10, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T), answer(9, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T), answer(8, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T), answer(7, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T), answer(6, message = "De acuerdo, lo conseguiremos juntos", correct = T), answer(5, message = "De acuerdo, lo conseguiremos juntos", correct = T), answer(4, message = "¡Me gusta tu confianza!", correct = T), answer(3, message = "¡Me gusta tu confianza!", correct = T), answer(2, message = "¡Me gusta tu confianza!", correct = T), answer(1, message = "¡Me gusta tu confianza!", correct = T), allow_retry = TRUE, correct = "Gracias por responder", min = 1, max = 10, step = 1 )
Por favor, envía un correo electrónico a contact@appliedepi.org si tienes preguntas sobre el uso de estos materiales.
En este ejercicio
Realiza ajustes en los temas (themes) de ggplots
Guardar ggplots como archivos PNG
Abre el proyecto "ebola" de RStudio y tu script "ebola_analysis.R", como de costumbre.
Añade los siguientes paquetes R a tu {pacman} al principio del script:
Ejecuta el código para instalar tus paquetes de R.
Si has salido de RStudio desde el ejercicio anterior, borra tu Entorno (environment) y vuelve a ejecutar todo el código de tu script para crear la base de datos vig
limpia.
Si encuentras errores, siempre tienes la opción de importar la copia de seguridad de la base de datos limpia que se encuentra en la carpeta "datos/limpios/copia_seguridad", "surveillance_linelist_clean_20141201.rds".
Los comandos de escala de ggplot sustituyen a la visualización por defecto de los mapeados estéticos, como
Como fórmula genérica, estos comandos se escriben como: scale_ESTÉTICA_MÉTODO()
.
scale_
este prefijo nunca cambiaESTÉTICA: _fill_
, _color_
, _x_
, _y_
etc.
MÉTODO: _continuous()
, _discrete()
, _manual()
, _date()
etc.
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()
|
Aquí mostramos dos formas diferentes de crear un gradiante de color continuo.
scale_*_continuous
las funciones trabajan con paletas de gradiante preconfiguradasscale_*_gradient()
crea un gradiante de 2 coloresscale_*_gradient2
te permite establecer también un color intermedio entre estos dosscale_gradient_n()
te permite crear paletas más complejas.Más información sobre estas funciones la puedes encontrar disponible aquí.
Prueba el siguiente código en tu sección "Gráficos sencillos":
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar()
Arriba, el relleno de un diagrama de barras utiliza la función colores e intervalos de eje por defecto.
Podemos ajustar estos aspectos añadiendo una función de escala (+
) al final de nuestro comando del gráfico.
A continuación, actualizamos el comando para ajustar el relleno de las barras manualmente utilizando scale_fill_manual()
.
Nuestro conjunto de datos incluye dos valores para sexo
("hombre" y "mujer"), y asignamos los rellenos deseados para cada uno dentro de un vector c()
. Para asignar un relleno a NA
lo especificamos con el argumento separado na.value =
.
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_manual( values = c( "hombre" = "violetred", "mujer" = "aquamarine"), na.value = "green")
¡Aquí hemos elegido unos colores feos para mostrar lo que estamos cambiando!
Prueba a cambiar el color de "hombre" a "dodgerblue" (un tipo de azul) y el de "mujer" a "tomato" (color tomate) para obtener una combinación de colores más bonita. Configura también NA como "grey" (gris).
Ten en cuenta que los valores de los caracteres que pongas en el vector c()
deben coincidir con los valores de los datos exactamente (por ejemplo, "hombre" NO es lo mismo que "varón").
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_manual( values = c( "hombre" = "dodgerblue", "mujer" = "tomato"), na.value = "grey")
{ggplot2} y el paquete {RColorBrewer} ofrecen una serie de paletas de colores preconfiguradas que son continuas, discretas, divergentes, etc.
Como aquí trabajamos con datos discretos, podemos utilizar la función scale_fill_brewer()
para acceder a las siguientes paletas en lugar de especificar nuestros propios colores:
Este comando muestra las paletas de colores del paquete {RColorBrewer} y sus códigos abreviados (por ejemplo "BuGn" para Azul-Verde:
RColorBrewer::display.brewer.all()
Como estamos trabajando con una escala discreta, el grupo medio de paletas de colores es el más apropiado. A continuación seleccionamos la paleta "Pastel2", y especificamos que los valores que faltan deben ser "grey" (grises).
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_brewer( palette = "Pastel2", na.value = "grey")
También hay disponible una paleta apta para daltónicos, del paquete {viridis}. Está disponible en forma discreta y continua con scale_fill_viridis_d()
y scale_fill_viridis_c()
:
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_viridis_d(na.value = "grey")
Ajusta tanto el comando ggplot anterior para utilizar edad_cat
en lugar de sexo
.
¿Cómo quedan las escalas "brewer" y viridis_d con más categorías?
quiz(caption = "Preunta - color brewer", question("¿Qué color tiene el grupo de edad 10-19 usanto scale_fill_brewer(palette = 'Pastel2')?", allow_retry = T, answer("green"), answer("yellow"), answer("orange", correct = T), answer("brown") ), question("¿Cuál es la importancia del relleno 'fill' en los comandos?", allow_retry = T, answer("Pide al gráfico de estar lleno de alegría"), answer("Porque es un gráfico de barras, el relleno es la estética que produce el color de las barras", correct = T), answer("Define el color de fondo (gris)"), answer("Ajusta los espacios entre las barras") ) )
Aplica lo que has aprendido para añadir una paleta de colores viridis continua viridis al siguiente gráfico.
Ten en cuenta que aquí estamos trabajando con una estética de color en lugar de una estética de relleno porque estamos utilizando geom_point()
. Es siempre mejor especificar un na.value =
(por ejemplo, "grey" (gris)).
ggplot( data = vig, mapping = aes( x = edad_anios, y = peso_kg, color = temp)) + geom_point()
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot( data = vig, mapping = aes( x = edad_anios, y = peso_kg, color = temp)) + geom_point() + scale_color_viridis_c(na.value = "grey")
Aquí tienes más recursos:
Viridis (prueba con option = "plasma"
o "infierno"), y sitio web colorbrewer (¡genial para identificar los códigos de color HEX!) Las funciones de paleta pueden añadirse a cualquier ggplot.
Podemos editar los ejes de forma similar, con comandos parecidos.
En un diagrama de barras como el siguiente, tenemos un eje Y continuo y un eje X discreto. Aquí podríamos decidir que las frecuencias del eje Y no son suficientemente descriptivas, por lo que desearíamos definir nuestros propios intervalos de eje.
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_viridis_d(na.value = "grey")
En scale_y_continuous()
ajustamos los intervalos del eje Y utilizando seq()
para definir una secuencia numérica.
Prueba a ejecutar el comando seq(from = 0, to = 250, by = 25)
en la consola de R, sólo para ver el resultado. Inténtalo de nuevo con diferentes valores de los argumentos.
Ahora, añade la función scale_y_continuous()
al gráfico anterior. Dentro de esta función, establece el argumento breaks =
a seq()
como se ha escrito anteriormente.
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_viridis_d(na.value = "grey") + scale_y_continuous( breaks = seq( from = 0, to = 250, by = 25))
Te habrás dado cuenta de que {ggplot2} tiene un comportamiento de expansión de su eje más allá de los datos, con un hueco entre los valores y el eje en la parte inferior. Esto puede arreglarse con comandos de escala para los ejes X e Y, utilizando su argumento expand =
.
Actualiza el ggplot()
anterior para incluir un segundo argumento en scale_y_continuous()
que sea expand = c(0,0)
.
Esto le dice al gráfico que inicie el eje Y en las coordenadas del gráfico (0,0) sin espacio intermedio.
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_viridis_d(na.value = "grey") + scale_y_continuous(breaks = seq(from = 0, to = 250, by = 25), expand = c(0,0))
Ahora, intenta aplicar la misma sintaxis expand = c(0,0)
al eje discreto x añadiendo scale_x_discrete()
:
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_viridis_d(na.value = "grey") + scale_y_continuous( breaks = seq( from = 0, to = 250, by = 25), expand = c(0,0)) + scale_x_discrete(expand = c(0,0))
Por último, voltea los ejes X e Y añadiendo coord_flip()
(con los paréntesis vacíos).
Esto es útil en los gráficos de barras para poder mostrar más nombres de valores discretos sin que se solapen los unos con otros en el eje X.
ggplot( data = vig, mapping = aes( x = distrito, fill = sexo)) + geom_bar() + scale_fill_viridis_d(na.value = "grey") + scale_y_continuous( breaks = seq( from = 0, to = 250, by = 25), expand = c(0,0)) + scale_x_discrete(expand = c(0,0))+ coord_flip()
Ten en cuenta que si ajustas las etiquetas con labs()
tienes que seguir usando x =
para ajustar la etiqueta que aparece ahora en el eje y.
Los ejes de fecha también tienen escalas que se pueden ajustar con las funciones de escala.
La escala por defecto para las etiquetas de los ejes de fecha variará según el rango de tus datos. Aquí tienes un ejemplo de gráfico:
ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram()
Probemos a ajustar las etiquetas de los ejes de fecha con scale_x_date()
.
En scale_x_date()
puedes utilizar el argumento date_breaks =
para proporcionar valores como "1 semana", "2 semanas" o "3 meses".
Nota: se trata de intervalos para el eje etiquetas. Esto no afecta a los rectángulos (bins) del histograma (la anchura de las barras). Discutiremos las mejores prácticas para establecer los anchos de los rectángulos de los histogramas de las curvas epidémicas en un módulo posterior.
Prueba a editar este código para que las etiquetas de fecha aparezcan cada 2 meses:
ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram()
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram() + scale_x_date(date_breaks = "2 months")
quiz(caption = "Pregunta - intervalos de fechas", question("¿Cuál es el formato predefinido que tiene el gráfico cuando se define 'date_breaks =' ?", allow_retry = T, answer("MM/DD/AAAA"), answer("DD/MM/AAAA"), answer("AAAA-MM-DD", correct = T), answer("AAAA-DD-MM") ) )
Puede que a ti (o a tu supervisor) no os guste que las etiquetas de fecha aparezcan como AAAA-MM-DD.
Puedes especificar el formato de las etiquetas de fecha con el argumento date_labels =
.
Este argumento acepta un valor nominal (escrito entre comillas) construido mediante sintaxis "strptime" - haz clic aquí para más información
Por ejemplo: el formato strptime "%d %b %Y"
cambiará la visualización de las etiquetas de fecha a DD MMM AAAA (ten en cuenta los espacios en lugar de guiones). También puedes activar una nueva línea con \n
por ejemplo, para desplazar el año por debajo del día y el mes.
ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram() + scale_x_date( date_breaks = "2 months", # specify date label interval date_labels = "%d %b \n %Y" ) # specify how date labels appear
Aquí tienes la lista completa de abreviaturas de strptime:
%A = Día de la semana completo (lunes, martes, etc.)
%w = Número del día de la semana (0-6, el domingo es 0)
Ver Manual Epi R Epicurves y Cadenas para más consejos
También existe una sencilla herramienta de etiquetas de fecha que utiliza la función {scales} paquete.
Poco intuitivamente, este enfoque se aplica utilizando la función labels =
en lugar de date_labels =
pero merece la pena.
Asigna labels =
a label_date_short()
. Asegúrate de escribir los paréntesis vacíos. Esto produce etiquetas de eje de fecha que muestran automáticamente la menor cantidad de información necesaria para transmitir los cambios de mes, año, etc. ¡Es muy bonito!
Puedes leer el {scales} documentación del paquete aquí o en tu panel de Ayuda. Tiene muchas funciones útiles.
ggplot( data = vig, mapping = aes(x = fecha_sintomas)) + geom_histogram() + scale_x_date( date_breaks = "2 months", # Intervalo de 2 meses para las etiquetas de fecha labels = label_date_short() ) # etiquetas de eje autosuficientes
Ajusta el date_breaks =
valor a "2 semanas".
¿Qué ocurre y cómo label_date_short()
se ajusta para tenerlo en cuenta?
En {scales} tiene otra función útil, percent()
que puede ajustar automáticamente los ejes para mostrar porcentajes, aunque en los datos los valores sean proporciones decimales.
Por el contrario, si intentaras modificar los valores subyacentes para mostrar un símbolo de carácter "%", ¡entonces tus valores se convertirían en nominales y no serían numéricos! Como sabes, el valor nominal "36"
es diferente del número 36
. En un eje, los valores nominales no se comportarán de forma intuitiva.
Afortunadamente, la función percent()
acepta proporciones decimales y las muestra como porcentajes, conservando sus propiedades numéricas. Se puede utilizar dentro de scale_y_continuous()
en un comando de gráfico.
Para probarlo crea este conjunto de datos a continuación, utilizando group_by()
y summarise()
que crea la proporción semanal de casos que tienen más de 7 días de retraso entre la fecha de inicio de los síntomas y su fecha de notificación.
difer1_sem <- vig %>% # empezamos con el listado de la vigilancia mutate(difer1_sem = as.numeric(difer) > 7) %>% # crea una columna que es TRUE si difer es mayor de 7 group_by(semana = floor_date(fecha_notifica, "week")) %>% # crea la columna de semana "week" y agrupa por esta nueva columna summarise( # empieza el comando de sintetizar (summarise) casos = n(), # número de casos en la semana retraso = sum(difer1_sem == TRUE, na.rm=T), # número de casos con retraso en la semana retraso_pct = retraso / casos) # calcula la proporción
Este nuevo conjunto de datos agregados tiene el siguiente aspecto:
difer1_sem %>% knitr::kable()
**Escribe un comando ggplot utilizando geom_line()
que tenga la siguiente configuración: **
difer1_sem
week
en el eje X
retraso_pct
en el eje Y
size = 2
y color = "brown"
en geom_line()
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot( data = difer1_sem, mapping = aes( x = semana, y = retraso_pct))+ geom_line( size = 2, color = "brown")
quiz(caption = "Pregunta - Escala de porcentaje en el eje de las Y", question("¿Qué comando scale_*() deberías usar para ajustar este eje de las y?", allow_retry = T, answer("scale_x_discrete()"), answer("scale_fill_continuous()"), answer("scale_y_continuous()", correct = T), answer("scale_color_discrete()") ) )
Ahora, aplica la función de escala adecuada, e incluye el argumento labels = percent
.
Ten en cuenta que al establecer este argumento igual a una función, no es necesario incluir los paréntesis al final de percent()
.
ggplot( data = difer1_sem, mapping = aes( x = semana, y = retraso_pct))+ geom_line( size = 2, color = "brown")+ scale_y_continuous(labels = percent)
Sigamos utilizando la matriz de datos y el gráfico del apartado anterior:
ggplot( data = difer1_sem, mapping = aes( x = semana, y = retraso_pct))+ geom_line( size = 2, color = "brown")+ scale_y_continuous(labels = percent)
Añade un pie de foto que diga
"n = 663. Informe elaborado el 2022-04-02. Datos recogidos en 5 grandes hospitales de la zona afectada por la epidemia. Último caso notificado el 21-12-2014. En 7 casos falta la fecha de inicio".
¡Pero! - Haz que cada frase empiece en una línea nueva.
r fontawesome::fa("lightbulb", fill = "gold")
Haz clic para leer una pista
Añade un labs()
y utiliza la función caption =
dentro de la función labs()
para añadir un título. Dentro de las comillas, coloca "\n" en cada lugar donde quieras que aparezca una nueva línea.
r fontawesome::fa("check", fill = "red")
Haz clic para ver una solución (¡pruébalo tú primero!)
ggplot(data = difer1_sem, mapping = aes(x = semana, y = retraso_pct))+ geom_line(size = 2, color = "brown")+ labs(caption = "n = 663.\nInforme creado el 2022-04-02.\nDatos recogido de 5 hospitales principales en la zona afectada.\nÚltimo caso notificado el 2014-12-21.\n7 casos sin fecha inicio síntomas no mostrados en el gráfico.")
Este pie de foto, tal como está escrito, funcionará... para este momento y conjunto de datos concretos. Pero, ¿qué ocurre si obtienes un conjunto de datos actualizado? El pie de foto es estático y seguirá siendo el mismo.
El {stringr} contiene la función str_glue()
que nos permite incrustar código dentro de un texto nominal para que los valores se actualicen cuando se vuelva a ejecutar el gráfico con nuevos datos.
Para utilizar esta función, primero, añade la frase nominal dentro de str_glue()
así: str_glue("n = 663")
. Esto imprimirá que n es el número estático 663.
Para que refleje dinámicamente el número de filas de la matriz de datos vig
puedes insertar llaves dentro de las comillas. Dentro de las llaves, inserta tu código R, por ejemplo, la función nrow()
str_glue("n = {nrow(vig)}")
(Prueba a ejecutar esto en tu consola de R)Observa que se imprimirá como n = número de filas en vig
en lugar de n = literalmente {nrow(vig)}.
Como puedes imaginar, str_glue()
es una función muy valiosa, ya que nos permite referenciar fácilmente la información de nuestra matriz de datos vig
sin tener que conocer o actualizar el valor exacto en nuestro script cada vez que se produzcan cambios en nuestros datos. Esto es especialmente útil cuando tenemos datos que se actualizan diaria, semanal o mensualmente, como un listado cuando estamos siguiendo un brote.
Dentro de las comillas del str_glue()
también puedes continuar escribiendo, e incluso incluir otras secciones de código:
str_glue("n = {nrow(vig)} confirmed cases.)
(Intenta ejecutar esto directamente en tu consola de R, o en la sección "Área de pruebas" de tu script)Incluso podemos ampliarlo para identificar, por ejemplo, el número de columnas de nuestra matriz de datos utilizando la función ncol()
función
str_glue("n = {nrow(vig)} confirmed cases. There are {ncol(vig)} columns in the datos frame")
(Intenta ejecutar esto directamente en tu consola de R, o en la sección "Área de pruebas" de tu script)Ahora ya ves la potencia de esto... hay otras funciones que te ayudarán a elaborar un pie de foto excelente:
unique()
es una función de R {base} que devuelve los valores únicos dentro de una columna, como unique(vig$distrito)
length()
para devolver el número de valores únicos: length(unique(vig$distrito))
Sys.Date()
devuelve la hora actual según tu ordenador. No pongas nada entre paréntesis.fmt_count()
es una función del paquete {epikit} que si se le proporciona una matriz de datos y unos criterios lógicos, devolverá una declaración con un formato agradable del número de observaciones. Por ejemplofmt_count(vig, is.na(hospital))
(Intenta ejecutar esto directamente en tu consola de R, o en la sección "Área de pruebas" de tu script)Ahora que tienes estas herramientas, revisa tu pie de foto de 4 frases para que todos los números se actualicen automáticamente. Podemos cambiar el número anterior para que esté representado por {nrow(vig)}
También podemos cambiar la fecha de creación de nuestro informe por {Sys.Date()}
. Piensa qué otros aspectos del pie de foto podemos cambiar para que se cree a partir de funciones, y mira la solución a continuación.
r fontawesome::fa("check", fill = "red")
Haz clic para ver la solución (¡pruébalo tú primero!)
ggplot(data = difer1_sem, mapping = aes(x = semana, y = retraso_pct))+ geom_line(size = 2, color = "brown")+ labs(caption = str_glue("n = {nrow(vig)}.\nInforme producido el {Sys.Date()}\nDatos recogidos de {length(unique(vig$hospital))-2} hospitales principales en la zona afectada.\nÚltimo caso notificado el {max(vig$fecha_notifica, na.rm = TRUE)}.\n{fmt_count(vig, is.na(fecha_notifica))} casos sin fecha inicio síntomas no mostrados en el gráfico."))
Observa que unique()
también contará los valores NA
y "Otros" (Otro) para nuestro recuento de hospitales. Por ello, puedes restar 2 de ese cálculo para asegurarte de que sólo informas de los hospitales principales.
Cuando tus pies de foto sean muy complejos, puedes organizar los str_glue()
de otra manera, para que sea más fácil de leer y manejar. También hablaremos de ello en el próximo módulo. En resumen, el código se separa y se coloca hacia la parte inferior de la función, con marcadores de posición en el propio texto. Mira esta sección del Manual de Epi R si estás interesado.
Los temas son características no relacionadas con los datos de diseño del gráfico (el fondo, el tamaño y color del texto, etc.).
{ggplot2} te permite añadir fácilmente "temas predefinidos" que transforman muchos aspectos de un gráfico con una simple función.
theme_bw() theme_classic() theme_dark() theme_gray() theme_minimal() theme_light() theme_void()
Prueba a añadir algunos de ellos a tus antiguos gráficos.
Prueba el argumento base_size = 16
dentro de la función tema (theme), para ajustar rápidamente el tamaño del texto.
¿Qué tema prefieres? ¡Márcalo mentalmente para utilizarlo más tarde!
Se pueden hacer microajustes del tema con theme()
.
No entraremos aquí en grandes details, ya que estos ajustes suelen ser para pequeños details visuales de diseño. Hay más información disponible aquí, en el Manual de Epi.
Lleva tiempo aprender la sintaxis de los temas y no se utiliza con tanta frecuencia como para memorizarla. Consulta esta lista de argumentos específicos de las funciones. O ejecútala, theme_get()
en tu ventana de R para obtener una lista de todos los argumentos temáticos en la consola.
Copia y pega este ejemplo de abajo en la consola de RStudio (los microajustes temáticos están en la parte inferior).
No hace falta que lo escribas, pues tardarías mucho tiempo. El propósito es que lo veas.
ggplot(data = vig, mapping = aes( x = edad_anios, y = alt_cm, color = sexo)) + geom_point( alpha = 0.7) + scale_color_brewer( palette = "Pastel2", na.value = "grey") + labs( title = "Altura y edad", subtitle = "Todos los hospitales", x = "Edad (anios)", y = "Altura (cm)", caption = "Datos ficticios de Ebola", color = "Sexo" ) + theme_classic(base_size = 16) + theme( legend.position = "bottom", # mover la leyenda abajo plot.title = element_text(color = "red", # color del título size = 20, # tamaño de la fuente del título face = "bold"), # título en negrita axis.title.y = element_text(angle = 0)) # rotar el título del eje y para que sea horizontal
La mayoría de los elementos del tema siguen una sintaxis similar de 2 partes, muy parecida a mapping = aes()
en la que proporcionas una función (element_text()
) como argumento de otra función.
Recuerda añadir cualquier ajuste en theme()
después de añadir el tema predefinido
A continuación se presentan algunos ajustes temáticos útiles:
| theme()
argumento | Qué ajusta |
| ------------------------ | -------------------------------------------------------------------------------------- |
| plot.title = element_text()
| El título |
| plot.subtitle = element_text()
| El subtítulo |
| plot.caption = element_text()
| El pie de foto (familia, estilo, color, tamaño, ángulo, vajust, hjust...) |
| axis.title = element_text()
| Los títulos de los ejes (x e y) (tamaño, estilo, ángulo, color...) |
| axis.title.x = element_text()
| Título del eje sólo para el eje x (utiliza .y sólo para el eje y) |
| axis.text = element_text()
| Texto del eje (tanto x como y) |
| axis.text.x = element_text()
| Texto del eje sólo eje x (utiliza .y sólo para el eje y) |
| axis.ticks = element_blank()
| Eliminar los intervalos del eje |
| axis.line = element_line()
| Líneas de los ejes (color, tamaño, tipo de línea: sólida, discontinua, punteada, etc.) |
| strip.text = element_text()
| Texto de banda de faceta (color, cara, tamaño, ángulo...) |
| strip.background = element_rect()
| marca facetada (relleno, color, tamaño...) |
Uno de los ajustes que probablemente harás con frecuencia es ajustar la legend.position =
del gráfico. Las opciones son "top"
, "bottom"
, "left"
, "right"
y "none"
(para ocultar completamente la leyenda). La posición de la leyenda también se puede establecer de forma más específica con c(x,y)
donde x e y se refieren a la posición a lo largo del eje x o y como proporción de la longitud total (es decir, abajo a la derecha es c(1,0))
La mayoría de los demás elementos del tema también se pueden eliminar con element_blank()
por ejemplo, para desactivar las líneas menores de la cuadrícula del eje y y el título de la leyenda.
Comprueba a continuación si entiendes los fundamentos de los temas:
quiz( question("¿Los ajustes del tema (theme) deberían hacerse antes o después de añadir un tema predefinido?", answer("antes"), answer("después", correct = TRUE) ), question("¿Cuál de los siguientes es un tema completo predefinido en ggplot?", answer("theme_bw()", correct = TRUE), answer("theme_classic()", correct = TRUE), answer("theme_red()"), answer("scale_color_brewer()") ), question("¿Cómo podrías ocultar una leyenda en ggplot?", answer("theme(legend.title = 'element.blank()')"), answer("theme(legend.position = 'right')"), answer("theme(legend.position(`none`))"), answer("theme(legend.position = 'none')", correct = TRUE) ), question("¿Cómo podrías ajustar la leyenda para que aparezca en el centro de tu gráfico?", answer("theme(legend.position = 'middle')"), answer("theme(legend.position = c(0.5,0.5))", correct = TRUE) ) )
¡Enhorabuena! ¡Has terminado todo el módulo sobre ggplot! Es un tema difícil, pero ahora tienes todas las herramientas esenciales para seguir adelante y hacer muchos tipos de gráficos.
Exportar ggplots es fácil con la función ggsave()
de {ggplot2}. Se escribe como un comando separado de tu comando ggplot()
. Puede ejecutarse de dos formas
Guarda tu gráfico como un objeto (con un nombre), y luego ejecuta el comando ggsave()
especificando el nombre del gráfico y la ruta de archivo deseada:
ggsave(my_plot, "my_plot.png")
Para guardar el último gráfico que se imprimió, ejecuta el comando especificando sólo la ruta de archivo deseada:
ggsave("my_plot.png")
Puedes exportar como png, pdf, jpeg, tiff, bmp, svg u otros tipos de archivo especificando la extensión del archivo en la ruta del archivo.
También puedes proporcionar los argumentos width =
, height =
y units =
(en "inch", "cm" o "mm"). También puedes indicar en dpi =
un número para la resolución del gráfico (por ejemplo, 300). Consulta los details de la función introduciendo ?ggsave
o leyendo la documentación en Internet.
Recuerda que puedes utilizar here()
para indicar la ruta del archivo deseado.
ggsave(my_plot, here("resultados", "epiweek21", "my_plot.png"))
Otros usuarios de R han creado temas predefinidos que puedes utilizar en tus gráficos Por ejemplo, el tema {ggthemes} contiene temas que harán que tus gráficos parezcan de The Economist, The Wall Street Journal, Tufte ¡e incluso STATA!
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.