Recursos de interés

Descripción general

En esta lección se cubren algunas de las capacidades de graficación del lenguaje de programación R. Se presentan ejemplos de varios tipos de gráficos estadísticos.

Objetivos

  1. Conocer los principales paquetes de graficación del lenguaje de programación R.
  2. Aprender algunas de las principales funciones de graficación de R para generar diferentes tipos de gráficos estadísticos, incluyendo:
    • Gráficos de dispersión.
    • Gráficos de líneas.
    • Gráficos de barras.

Trabajo previo

Se recomienda leer el capítulo 2 del libro R Graphics Cookbook, de Winston Chang.

Graficación en R

Paquetes

R provee varios paquetes para generar gráficos. Aquí se estudiarán dos:

Carga de los paquetes

Antes de utilizarse, los paquetes deben cargarse con la función library().

# Carga de graphics
library("graphics")

# Carga de ggplot2
library("ggplot2")
## Registered S3 methods overwritten by 'ggplot2':
##   method         from 
##   [.quosures     rlang
##   c.quosures     rlang
##   print.quosures rlang
# Opcionalmente, puede instalarse toda la colección tidyverse
library("tidyverse")

Si es necesario, ggplot2 y tidyverse pueden instalare con la función install.packages():

# Instalación de ggplot2
install.packages("ggplot2")

# Instalación de tidyverse
install.packages("tidyverse")

Para obtener información sobre un paquete:

# Ayuda en línea sobre ggplot2
library(help="ggplot2")

Conjuntos de datos utilizados en los ejemplos

En los siguientes ejemplos y ejercicios, se utilizarán dos conjuntos de datos, los cuales se cargan en data frames con la función read.csv() y se visualizan con la función View():

Casos de Covid-19 en Centroamérica y República Dominicana

Este conjunto de datos tiene un registro por país con los casos (confirmados, fallecidos, activos, etc.) acumulados hasta la fecha en cada uno.

# Datos en la Web
ca_covid19 <- read.csv(file='https://raw.githubusercontent.com/geoprocesamiento-2020i/datos/master/covid19/casos/ca/ca-covid19.csv')

# Datos locales
# ca_covid19 <- read.csv(file='/home/mfvargas/geogrocesamiento-2020i/datos/covid19/casos/ca/ca-covid19.csv')

# Despliegue de los datos
View(ca_covid19)

Casos de Covid-19 en Costa Rica

Este conjunto de datos es un ejemplo de una serie temporal: una sucesión de datos medidos en determinados momentos y ordenados cronológicamente. Contiene un registro por día con las estadísticas de casos confirmados, fallecidos, activos y otras variables.

# Datos en la Web
cr_covid19 <- read.csv(file='https://raw.githubusercontent.com/geoprocesamiento-2020i/datos/master/covid19/casos/cr/cr-covid19-pais-acumulados.csv')

# Datos locales
# cr_covid19 <- read.csv(file='/home/mfvargas/geogrocesamiento-2020i/datos/covid19/casos/cr/cr-covid19-pais-acumulados.csv')

# Despliegue de los datos
View(cr_covid19)

Tipos de gráficos

Gráficos de dispersión

Un diagrama o gráfico de dispersión (scatter plot) muestra la relación entre dos variables numéricas. Para cada punto de datos, el valor de la primera variable se representa en el eje X y el de la segunda variable en el eje Y.

La función plot() del paquete graphics recibe como argumentos los vectores de las variables que se desean graficar. El siguiente ejemplo usa las variables de casos descartados y casos confirmados de Covid-19 en Costa Rica.

plot(cr_covid19$descartados, cr_covid19$confirmados)

Para mejorar el gráfico, pueden utilizarse otras opciones de la función plot():

plot(cr_covid19$descartados, 
     cr_covid19$confirmados,
     main='Relación entre casos descartados y confirmados de Covid-19 en CR',
     xlab='Casos descartados',
     ylab='Casos confirmados'
     )

Con la función gglot(), del paquete ggplot2, puede obtenerse un resultado similar:

ggplot(cr_covid19, aes(x = descartados, y = confirmados)) +
  ggtitle('Relación entre casos descartados y confirmados de Covid-19 en CR') +
  xlab('Casos descartados') +
  ylab('Casos confirmados') +
  geom_point()

La manera usual de usar gglot() es con un data frame como argumento, especificando cuales columnas usar como valores de x e y. La primera parte, gglot(), crea la base del gráfico (i.e. el canvas), mientras que geom_point() agrega una capa adicional, lo mismo que ggtitle() y las funciones restantes.

Gráficos de líneas

Un gráfico de líneas (line graph o line chart) muestra la evolución de una o varias variables numéricas. Los puntos de datos se conectan mediante segmentos de líneas rectas. Los gráficos de líneas son usados frecuentemente para visualizar tendencias de los datos en intervalos de tiempo (i.e. en series temporales).

Puede hacerse un gráfico de líneas con la función plot() al pasarle como argumento type="l".

plot(cr_covid19$descartados, 
     cr_covid19$confirmados,
     main='Relación entre casos descartados y confirmados de Covid-19 en CR',
     xlab='Casos descartados',
     ylab='Casos confirmados',
     type="l"
     )

Si se desea agregar más líneas, o series de puntos, debe entonces llamarse a plot() para la primera variable (ej. la primera línea) y luego agregar las restantes series de líneas o de puntos con las funciones lines() y points().

# línea de casos confirmados
plot(cr_covid19$descartados, 
     cr_covid19$confirmados,
     main='Relación entre casos descartados y confirmados/activos\n de Covid-19 en CR',
     xlab='Casos descartados',
     ylab='Casos confirmados (azul)/activos (rojo)',
     type="l",
     col="blue"
     )
# puntos de casos confirmados
points(cr_covid19$descartados, cr_covid19$confirmados, col="blue")

# líneas y puntos de casos activos
lines(cr_covid19$descartados, cr_covid19$activos, col="red")
points(cr_covid19$descartados, cr_covid19$activos, col="red")

Con las funciones de ggplot2 puede conseguirse un resultado similar al crear el gráfico base con ggplot() y agregar las series de líneas y puntos con geom_line() y geom_point().

ggplot(cr_covid19, aes(x=descartados)) + 
  ggtitle("Relación entre casos descartados y confirmados/activos de Covid-19 en CR") +
  xlab("Casos descartados") + 
  ylab("Casos confirmados (azul) /activos (rojo)") +
  geom_line(aes(y = confirmados), color = "blue") +
  geom_point(aes(y = confirmados), color = "blue") + 
  geom_line(aes(y = activos), color="red") +
  geom_point(aes(y = activos), color = "red")

Gráficos de barras

Los gráficos de barras (barcharts o barplots) muestran la relación entre una variable categórica y una variable numérica. Cada entidad de la variable categórica es representada mediante una barra, en la que su altura representa el valor correspondiente de la variable numérica.

Para los ejemplos de esta sección, se utilizará el conjunto de datos de casos de Covid-19 de Centroamérica y República Dominicana. Para facilitar su visualización, se ordenan los registros de acuerdo con la columna de casos confirmados, mediante la función order().

# Ordenar de mayor a menor
ca_confirmados.ordenado <- order(ca_covid19$confirmados, decreasing=TRUE)

# Nuevo data frame ordenado
ca_covid19.confirmados <- ca_covid19[ca_confirmados.ordenado,]

La función barplot(), del paquete graphics, se utiliza en el siguiente ejemplo para generar un gráfico de barras de los casos confirmados.

barplot(
  height=ca_covid19.confirmados$confirmados, 
  names.arg=ca_covid19.confirmados$pais, 
  xlab="País", 
  ylab="Casos confirmados", 
  main="Casos confirmados de Covid-19 en Centroamérica y DOM"
)

La función geom_col(), en combinación con ggplot(), puede utilizarse para generar gráficos de barras.

ggplot(ca_covid19, aes(x=reorder(pais, -confirmados), y=confirmados)) +
  ggtitle("Casos confirmados de Covid-19 en Centroamérica y DOM") +
  xlab("Casos descartados") + 
  ylab("Casos confirmados") +  
  geom_col() +
  geom_text(aes(label=confirmados), vjust=-0.3, size=3.5)

Note el uso de la función reorder() en el ejemplo anterior, para ordenar el orden de las barras (i.e. los países) en el eje X y el de geom_text() para desplegar etiquetas sobre las barras.

Series temporales

Las series temporales muestran los datos de algún fenómeno a lo largo de un periodo de tiempo. En R, el tiempo se maneja con tipos de datos especiales para fechas y horas.

El tipo de datos Date
# Variable tipo caracter
hoy.char = "2020-04-27"
print(hoy.char)
## [1] "2020-04-27"
print(typeof(hoy.char))
## [1] "character"

La función as.Date() convierte un texto a tipo fecha:

# Variable tipo date
hoy.fecha = as.Date(hoy.char)
print(hoy.fecha)
## [1] "2020-04-27"
print(typeof(hoy.fecha))
## [1] "double"

Internamente, R maneja las fechas como números que empiezan el 1 de enero de 1970 (las fechas anteriores son números negativos). Las fechas pueden sumarse y restarse:

# Suma de días a una fecha
print(hoy.fecha + 4)
## [1] "2020-05-01"
Gráficos con fechas

En los siguientes ejemplos, se utilizará el paquete ggplot2 y el conjunto de datos de casos de COVID-19 en Costa Rica.

# Carga de ggplot2
library("ggplot2")

# Opción para interpretar los datos de la columna de fechas como caracteres y no como factores (i.e. categorías)
options(stringsAsFactors = FALSE)

# Carga de datos de COVID-19 en Costa Rica en un dataframe
cr_covid19 <- read.csv(file='https://raw.githubusercontent.com/geoprocesamiento-2020i/datos/master/covid19/casos/cr/cr-covid19-pais-acumulados.csv')

# Estructura del data frame (observe los tipos de datos de las columnas)
str(cr_covid19)
## 'data.frame':    52 obs. of  26 variables:
##  $ fecha                       : chr  "2020-03-06" "2020-03-07" "2020-03-08" "2020-03-09" ...
##  $ hora                        : chr  "16:09" "19:50" "18:38" "13:55" ...
##  $ confirmados                 : int  1 5 9 9 13 22 23 26 27 35 ...
##  $ fallecidos                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ recuperados                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ descartados                 : int  2 2 12 35 59 118 206 289 415 450 ...
##  $ activos                     : int  1 5 9 9 13 22 23 26 27 35 ...
##  $ confirmados_mujeres         : int  1 3 6 6 8 14 14 14 15 19 ...
##  $ confirmados_hombres         : int  0 2 3 3 5 8 9 12 12 16 ...
##  $ confirmados_adultos         : int  1 4 7 7 9 18 19 21 22 28 ...
##  $ confirmados_mayores         : int  0 1 2 2 2 2 2 3 3 3 ...
##  $ confirmados_menores         : int  0 0 0 0 2 2 2 2 2 4 ...
##  $ confirmados_costarricenses  : int  0 3 6 6 8 19 20 23 23 30 ...
##  $ confirmados_extranjeros     : int  1 2 3 3 3 3 3 3 4 5 ...
##  $ confirmados_edad_min        : int  49 49 49 49 11 10 10 10 10 10 ...
##  $ confirmados_edad_max        : int  49 73 73 73 73 73 73 87 87 87 ...
##  $ confirmados_edad_prom       : int  49 53 53 NA 47 NA NA NA NA NA ...
##  $ hospitalizados              : int  0 3 NA NA NA NA NA NA NA NA ...
##  $ hospitalizados_salon        : int  0 2 NA NA NA NA NA NA NA NA ...
##  $ hospitalizados_uci          : int  0 1 NA NA NA NA 1 3 4 4 ...
##  $ hospitalizados_uci_edad_min : int  NA 73 NA NA NA NA NA NA NA NA ...
##  $ hospitalizados_uci_edad_max : int  NA 73 NA NA NA NA NA NA NA NA ...
##  $ hospitalizados_uci_edad_prom: int  NA 73 NA NA NA NA NA NA NA NA ...
##  $ comentarios                 : chr  "La extranjera era de EEUU." "Los dos extranjeros eran de EEUU." "Los tres extranjeros eran de EEUU." "Los tres extranjeros eran de EEUU. Provincias con casos confirmados: San José, Alajuela, Guanacaste y Heredia." ...
##  $ fuente_oficial              : chr  "https://www.ministeriodesalud.go.cr/index.php/centro-de-prensa/noticias/741-noticias-2020/1555-caso-confirmado-"| __truncated__ "https://www.ministeriodesalud.go.cr/index.php/centro-de-prensa/noticias/741-noticias-2020/1557-ministerio-de-sa"| __truncated__ "https://www.ministeriodesalud.go.cr/index.php/centro-de-prensa/noticias/741-noticias-2020/1558-ante-casos-de-co"| __truncated__ "https://www.ministeriodesalud.go.cr/index.php/centro-de-prensa/noticias/741-noticias-2020/1560-gobierno-cancela"| __truncated__ ...
##  $ fuentes_adicionales         : chr  "https://twitter.com/delfinocrc/status/1236041661119070209" "https://twitter.com/delfinocrc/status/1236460218571264000" "https://twitter.com/delfinocrc/status/1236812413250482176" "https://twitter.com/delfinocrc/status/1237097682096840705" ...

Graficación de la cantidad de casos confirmados a través del tiempo:

# Gráfico de casos confirmados
ggplot(data = cr_covid19, aes(x = fecha, y = confirmados)) +
  geom_point() +
  labs(x = "Fecha",
    y = "Casos confirmados",
    title = "Casos confirmados de COVID-19 en Costa Rica",
    subtitle = "Fuente: Ministerio de Salud")

Para visualizar mejor los resultados, es conveniente convertir la columna fecha al tipo Date:

# Conversión
cr_covid19$fecha <- as.Date(cr_covid19$fecha)

# Revisión del tipo de datos
class(cr_covid19$fecha)
## [1] "Date"
# Visualización de los primeros registros
head(cr_covid19$fecha)
## [1] "2020-03-06" "2020-03-07" "2020-03-08" "2020-03-09" "2020-03-10"
## [6] "2020-03-11"

Se repite el gráfico anterior de puntos:

# Gráfico de casos confirmados
ggplot(data = cr_covid19, aes(x = fecha, y = confirmados)) +
  geom_point(color = "blue") +
  labs(x = "Fecha",
    y = "Casos confirmados",
    title = "Casos confirmados de COVID-19 en Costa Rica",
    subtitle = "Fuente: Ministerio de Salud")

Gráfico de barras:

ggplot(data = cr_covid19, aes(x = fecha, y = confirmados)) +
  geom_bar(stat = "identity", fill = "blue") +
  labs(x = "Fecha",
    y = "Casos confirmados",
    title = "Casos confirmados de COVID-19 en Costa Rica",
    subtitle = "Fuente: Ministerio de Salud")

Gráfico con varias series de datos:

ggplot(data = cr_covid19, aes(x = fecha, y = activos)) +
  labs(x = "Fecha",
    y = "Casos confirmados (azul) / activos (rojo)",
    title = "Casos confirmados de COVID-19",
    subtitle = "Fuente: Ministerio de Salud") +
  geom_line(aes(y = confirmados), color = "blue") +  
  geom_bar(stat = "identity", fill = "red")

Los siguientes ejemplos muestran como especificar cortes (breaks) personalizados en las fechas del eje X. Se utiliza el paquete dplyr, para manipulación y tranformación de datos, el cuál también es parte de Tidyverse.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Se separa un subconjunto de datos, de acuerdo con un rango de fechas:
cr_covid19_marzo <- cr_covid19 %>%
  filter(fecha >= as.Date("2020-03-06") & fecha <  as.Date("2020-03-31"))

# Creación del gráfico base, sin los cortes:
cr_covid19_grafico <- ggplot(cr_covid19_marzo, aes(x = fecha, y = confirmados)) +
  geom_line()

cr_covid19_grafico

Los cortes se especificar mediante la función seq():

# Los cortes se almacenan en un vector
cortes <- seq(as.Date("2020-03-06"), as.Date("2020-03-31"), by = "3 day")

# Gráfico con cortes y ángulos en las etiquetas
cr_covid19_grafico +
  scale_x_date(breaks = cortes) +
  theme(axis.text.x = element_text(angle = 30, hjust = 1))