Desarrollo del contenido (desarrolle cada uno de los temas teniendo en cuentas la tabla de contenido)
Tema 1: Principios de la gramática de gráficos con
ggplot2
ggplot2 es un paquete de R basado en la gramática de
gráficos que permite visualizar datos de una manera consistente y
estructurada.
ggplot2recibe su nombre precisamente de la abreviación
del término gramática de gráficos (gg). La gramática de gráficos se
refiere a un enfoque conceptual propuesto y desarrollado por Leland
Wilkinson para la creación de gráficos, el cual sirvió como base para el
desarrollo de ggplot2 a manos de Hadley Wickham.
La gramática de gráficos proporciona un marco conceptual para pensar sobre cómo construir y entender visualizaciones de datos de una manera coherente y estructurada. En términos simples, la gramática de gráficos descompone un gráfico en sus componentes fundamentales y define cómo se combinan estos componentes para representar datos.
Estos componentes básicos son:
1. Datos (Data): representan los datos que queremos visualizar. Puede ser una tabla de datos (data.frame) en R u otra fuente de datos.
2. Estética (Aesthetics): definen cómo se mapean los
atributos de los datos a propiedades visuales del gráfico, como posición
en el eje X (x), posición en el eje Y (y), color, forma, tamaño, etc.
Esto se especifica mediante la función aes() en
ggplot2.
3. Geometría (Geometry): representa la forma en que
los datos se visualizan en el gráfico, como puntos, líneas, barras,
áreas, etc. Cada tipo de gráfico tiene su función correspondiente
enggplot2, como geom_point() para un gráfico de dispersión
o geom_bar() para un gráfico de barras.
4. Escala (Scale): define cómo se mapean los valores
de los datos a los valores visuales, como el rango de colores o el rango
de los ejes. ggplot2ajusta automáticamente las escalas,
pero también puedes personalizarlas con funciones como
scale_log10(), scale_x_continuous() o
scale_color_manual().
5. Facetas (Facets): permiten dividir los datos en
subconjuntos y mostrarlos en paneles múltiples (facetas) según ciertas
variables. Puedes usar facet_wrap() o facet_grid() en
ggplot2para implementar esta funcionalidad.
6. Temas (Themes): controlan la apariencia visual
general del gráfico, como títulos, etiquetas de ejes, fondos, etc.
Puedes personalizar el tema con la función theme() en
ggplot2.
Por ejemplo, una estructura clásica de un gráfico de puntos será:
ggplot(data, \# Los datos
Aes(x, y) \# La estética
Geom_point()) + \# la geometría
Tema 2: Ejemplos del uso de la gramática de gráficos con ggplot
Aquí vamos a ir explicando cómo puedes hacer uso de esta herramienta en tu computador. A medida que avanzas trata de ir replicando los ejercicios.
NOTA. Para hacer más versátil su uso, se recomienda
conocer el funcionamiento del paquete dplyr y el uso de tuberías (pipes
%>%), puedes repasar estos temas en la Unidad 1 de este módulo
“Introducción a R y RStudio”. Por su parte, ggplot2 está
contenido dentro de la librería Tidyverse. Además, Tidiverse incluye
otras librerías como dplyr que, a su vez, incluye las pipes (%>%).
Para más detalles sobre Tidyverse consulta la unidad de “Introducción a
R y RStudio”.
Para los ejercicios prácticos de esta unidad es necesario cargar las siguientes librerías:
library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Ahora, veremos cada uno de los componentes para realizar gráficos de
datos con ggplot2 a través de un ejercicio práctico. Se
requiere una tabla de datos (una estructura con filas y columnas) para
poder ser usada en la estética de los gráficos. Previo al uso de
ggplot2, suele ser necesario realizar un proceso de
limpieza y organización de los datos. Para este ejercicio práctico
usaremos una base de datos limpia, que nos permita hacer las
visualizaciones sin la necesidad de pre-procesar los datos.
La tabla de datos para este ejercicio puedes encontrarla en: https://github.com/TRACE-LAC/TRACE-LAC-data/blob/main/otros/muestra_covid.RDS?raw=true
Cuando ya tengas los datos descargados en tu computador y en la carpeta de data de tu proyecto puedes ejecutar el siguiente comando:
covid19 <- readRDS("data/muestra_covid.RDS")
Una vez obtenida la tabla de datos vamos a explorar los datos para
conocer el estado actual y revisar qué variables podríamos usar para las
visualizaciones. Para esto utilizamos una de las funciones vistas en la
unidad de “Introducción a R y RStudio” llamada
glimpse.Úsala y verifica la estructura de la tabla de
datos
glimpse(covid19)
## Rows: 100,000
## Columns: 19
## $ fecha_reporte_web <date> 2021-04-09, 2021-03-18, 2022-01…
## $ id_de_caso <dbl> 2493495, 2318883, 5290100, 43526…
## $ fecha_de_notificacion <date> 2021-03-27, 2021-03-06, 2022-01…
## $ edad <dbl> 45, 38, 34, 64, 24, 16, 25, 72, …
## $ sexo <fct> femenino, masculino, masculino, …
## $ tipo_de_contagio <chr> "Comunitaria", "Comunitaria", "C…
## $ ubicacion_del_caso <chr> "Casa", "Casa", "Casa", "Casa", …
## $ estado <fct> Leve, Leve, Leve, Leve, Leve, Le…
## $ recuperado <fct> Recuperado, Recuperado, Recupera…
## $ fecha_de_inicio_de_sintomas <date> 2021-03-24, 2021-03-03, 2022-01…
## $ fecha_de_muerte <date> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ fecha_de_diagnostico <date> 2021-04-07, 2021-03-17, 2022-01…
## $ fecha_de_recuperacion <date> 2021-04-10, 2021-03-19, 2022-01…
## $ fecha_de_nacimiento <date> 1975-06-01, 1975-06-08, 1975-06…
## $ nombre_del_pais <chr> "Colombia", "Cuba", "Nicaragua",…
## $ sintomas <fct> Leve, Leve, Leve, Leve, Leve, Le…
## $ numero_de_hospitalizaciones_recientes <dbl> 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1,…
## $ tension_sistolica <dbl> 107, 126, 107, 134, 126, 156, 14…
## $ tension_diastolica <dbl> 87, 64, 73, 76, 83, 96, 76, 87, …
En el contexto de la gramática de gráficos, la estética (aesthetics) se refiere a cómo mapeamos los atributos de nuestros datos a propiedades visuales en el gráfico. Estas propiedades visuales pueden ser elementos tales como la posición en el eje X (x), la posición en el eje Y (y), el color (color), la forma(shape), el tamaño(size), etc. Al mapear estos atributos podemos crear visualizaciones que nos permiten comprender y comunicar patrones y relaciones en los datos de manera efectiva.
Enggplot2 la función principal para especificar la
estética es aes(). A continuación algunos ejemplos para
ilustrar cómo usar la estética en ggplot2.
Ejemplo 1: Gráfico de dispersión (scatter plot)
Supongamos que tenemos una tabla que cuenta con las variables xe
y. Queremos crear un gráfico de dispersión donde la variable x
se mapea en el eje X y la variable y en el eje Y. Además, queremos que
los puntos se coloreen según la variable grupo. Mediante la función
aes() de ggplot2 es posible asignar estas
variables a los correspondientes atributos visuales del gráfico, como
veremos en el ejemplo a continuación.
Consideremos la base covid19 que cargamos previamente. El
requerimiento es realizar un gráfico de dispersión que muestre el número
de casos por fecha de reporte y desagregados por sexo. Para esto,
primero organizamos los datos para lograr una tabla resumen con la
información que queremos graficar, usando tidyverse de la
siguiente manera:
covid19_resumen <- covid19 %>%
group_by(fecha_reporte_web, sexo) %>%
summarise(casos = n())
## `summarise()` has grouped output by 'fecha_reporte_web'. You can override using
## the `.groups` argument.
Luego, podemos usar la estética de los gráficos de
ggplot2 indicando las variables a usar en cada dimensión,
en este caso en el eje X tendremos la variable de tiempo
(fecha_reporte_web) y en el eje Y el número de casos (casos). Para ver
la desagregación por sexo haremos uso de uno de los atributos como el
color. Estas instrucciones pueden seguirse a través del siguiente
código:
ggplot(data = covid19_resumen,
aes(x = fecha_reporte_web, y = casos, colour = sexo)) +
geom_point()
La visualización que generamos es la siguiente:
Geometría (Geometry):
La geometría representa la forma en que los datos se visualizan en el
gráfico; como puntos, líneas, barras, áreas, etc. Cada tipo de gráfico
tiene su función correspondiente en ggplot2; por ejemplo
geom_point() para un gráfico de dispersión o
geom_bar() para un gráfico de barras.
En la siguiente tabla se muestran algunos ejemplos de los distintos
tipos de geometrías más usados en ggplot2 con su
correspondiente comando:
Ejemplo 2: Gráfico de líneas
Supongamos que queremos visualizar la evolución del número de casos de covid-19 a lo largo del tiempo. Para esto, primero debemos preparar el conjunto de datos que formarán el gráfico:
covid19_fecha <- covid19 %>%
group_by(fecha_reporte_web) %>%
summarise(casos = n())
Una vez el conjunto de datos esté listo, procedemos a usar la
geometría de ggplot2:
ggplot(data = covid19_fecha,
aes(x = fecha_reporte_web, y = casos)) +
geom_line()
Y obtenemos el siguiente gráfico:
Ejemplo 3: Gráfico de barras
Ahora, hagamos una visualización en forma de gráfico de barras del
total de casos positivos por sexo, para esto utilizamos el comando
geom_bar() así:
ggplot(data = covid19) +
geom_bar(aes(x = sexo))
En este ejemplo podemos observar que ggplot2
automáticamente calcula el eje Y.
Ejemplo 4. Gráfico de barras más complejo
Primero vamos a preparar los datos en una tabla de datos que permita contar el número de casos por paises:
covid19_pais <- covid19 %>%
group_by(nombre_del_pais) %>%
summarise(casos = n())
Ahora, por medio de la geometría de ggplot, hacemos la
visualización usando el argumento stat = "identity" que
calcula la suma de la variable y = casos agrupando por la
variable x = nombre_del_pais:
ggplot(data = covid19_pais, aes(x = nombre_del_pais, y = casos)) +
geom_bar(stat = "identity")
Debes obtener la siguiente gráfica:
Podemos notar que no es posible ver bien los nombres de los paises. Para solucionar este problema, una alternativa es dar la vuelta a los ejes, usando al final el comando coord_flip de la siguiente manera:
ggplot(data = covid19_pais, aes(x = nombre_del_pais, y = casos)) +
geom_bar(stat = "identity") +
coord_flip()
Obteniendo como resultado:
Si queremos ordenar los paises por el número de casos, podemos
utilizar el comando reorderen el eje donde está el país. La función
reorder tiene dos argumentos: el primero es la variable a ordenar y el
segundo es la variable que otorga el orden. En este caso sería
reorder(nombre_del_pais, -casos) si queremos ordenar de
menor a mayor. El código sería el siguiente:
ggplot(covid19_pais,
aes(x = reorder(nombre_del_pais, -casos), y = casos)) +
geom_bar(stat = "identity") +
coord_flip()
Y la gráfica queda así:
Pregunta ¿cómo producirías esta misma gráfica, pero en orden descendente?
Escala:
En la gramática de gráficos en ggplot2, la escala se
refiere a la forma en que los valores de los datos se traducen en
propiedades visuales. La elección adecuada de las escalas es esencial
para que los gráficos sean interpretables y precisos.
A continuación, veremos algunos de los diferentes tipos de escalas
disponibles en ggplot2 y sus funciones:
scale_x_continuous() y
scale_y_continuous() : para el eje x y el eje y,
respectivamente.
scale_color_continuous(): asigna colores a los
valores continuos.
scale_size_continuous(): asigna tamaño a los
valores.
scale_x_discrete() y
scale_y_discrete(): para el eje x y el eje y,
respectivamente.
scale_color_discrete(): asigna colores a los valores
discretos.
scale_shape_discrete(): asigna diferentes formas a
los diferentes valores discretos.
scale_x_date() y scale_y_date(): para el
eje x y el eje y, respectivamente cuando se tengan datos de fecha.scale_color_manual(): se especifica manualmente los
colores para los valores.
scale_shape_manual(): se especifica manualmente las
formas para los valores.
scale_fill_*: se usa similar a las escalas de color
pero para colores que queramos con relleno.
scale_size_area(): Asigna los valores al área en
lugar del diámetro, lo que puede ser útil para los puntos.
scale_linetype(): para diferente tipos de
línea
scale_y_log10(): para hacer uso de escala
logarítmica en eje y.
scale_colour_gradient(): crea un degradé de color
entre bajo y alto o scale_colour_gradient2() en bajo, medio
y alto.
A continuación, veremos algunos ejemplos de cómo usar la escala en
ggplot2con el data.frame previamente cargada
covid19.
Facetas
Las Facetas (Facets) en la gramática de gráficos son una
forma de dividir los datos en subconjuntos y representarlos en múltiples
paneles dentro del mismo gráfico. Esto nos permite visualizar diferentes
aspectos de los datos o comparar grupos de manera más efectiva. En
ggplot2, podemos usar la función facet_wrap()
o facet_grid() para implementar las facetas, dependiendo
del número de variables a usar para la creación de los paneles.
Ejemplo 5. Gráfico con facet wrap
Primero vamos a preparar los datos en una tabla de datos que permita
contar el número de casos por sexo:
covid19_sexo <- covid19 %>%
group_by(edad, sexo) %>%
summarise(casos = n())
## `summarise()` has grouped output by 'edad'. You can override using the
## `.groups` argument.
Usando los datos de covid-19, vamos a representar la
variable casos en dos paneles por sexo usando
facet_wrap así:
ggplot(data = covid19_sexo, aes(x = edad, y = casos)) +
geom_point() +
facet_wrap(~sexo)
Tema
En la gramática de gráficos, el tema se refiere a la personalización de la apariencia visual general del gráfico; como los títulos, etiquetas de ejes, fondos, colores, tamaños de fuente, entre otros elementos. Con los temas, podemos mejorar la legibilidad y estética de los gráficos, asegurando que la información se comunique de manera efectiva y atractiva.
En ggplot2, podemos aplicar un tema predeterminado
utilizando la función theme(). A continuación,
proporcionamos algunos ejemplos de cómo utilizar los temas en
ggplot2 con la base de datos covid19.
Ejemplo 6. Usando theme classic
Para usar el tema clásico tenemos:
ggplot(data = covid19_sexo, aes(x = edad, y = casos)) +
geom_point() +
facet_wrap(~sexo) +
theme_classic()
Para revisar la lista de theme() que tiene disponible
ggplot2, puede consultarse en https://ggplot2.tidyverse.org/reference/ggtheme.html
Finalmente, veamos un ejemplo de cómo modificar los themes manualmente.
Ejemplo 8. Cambiando títulos, subtítulos y ejes
Podemos usar comandos como xlab, ylab para
cambiar los nombres de los ejes. Igualmente, comandos como title y
subtitle de la siguiente forma:
ggplot(data = covid19_sexo,
aes(x = edad, y = casos, colour = sexo)) +
geom_point() +
facet_wrap(~sexo) +
labs(
y = "Casos diarios", x = "Edad en años",
colour = "Sexo",
title = "Distribución de casos de COVID-19 por edad y sexo en Latinoamerica"
)
Licencia: CC-BY Copyright: Zulma M. Cucunuba, 2019