El código fuente de este documento está disponible en https://github.com/pf0953-programaciongeoespacialr-2020/leccion-04-r-graficacion.

Recursos de interés

Trabajo previo

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

Conjuntos de datos utilizados

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 Costa Rica
Este conjunto de datos publicados por el Ministerio de Salud de Costa Rica 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 positivos, fallecidos, activos y recuperados.

# Carga de datos desde un archivo CSV
cr_covid19 <- read.csv(file='https://raw.githubusercontent.com/pf0953-programaciongeoespacialr-2020/datos/master/covid19/casos/cr/2020_09_08_CSV_GENERAL.csv')
# Despliegue de los datos
View(cr_covid19)

Casos de COVID-19 en Centroamérica y República Dominicana
Este conjunto de datos publicados por el Centro de Coordinación para la Prevención de los Desastres en Centroamérica y República Dominicana (Cepredenac) tiene un registro por país con los casos (positivos, fallecidos, activos, recuperados) acumulados hasta la fecha en cada uno.

# Carga de datos desde un archivo CSV
ca_covid19 <- read.csv(file='https://raw.githubusercontent.com/pf0953-programaciongeoespacialr-2020/datos/master/covid19/casos/ca/2020_09_01_CSV_GENERAL.csv')
# Despliegue de los datos
View(ca_covid19)

Paquetes de R para graficación

R provee varios paquetes (i.e. bibliotecas de funciones) para generar gráficos. Aquí se estudiarán tres:

Instalación, carga y ayuda

En R, los paquetes pueden instarlarse con la función install.packages():

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

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

# Instalación de dplyr
# (paquete para manipulación de datos de Tidyverse)
install.packages("dplyr")

# Opcionalmente, pueden instalarse todos los paquetes de Tidyverse
install.packages("tidyverse")

Después de la instalación, los paquetes deben cargarse con la función library().

# Carga de graphics
library(graphics)

# Carga de ggplot2
library(ggplot2)

# Carga de plotly
library(plotly)

# Carga de dplyr
library(dplyr)

# Opcionalmente, puede cargarse toda la colección tidyverse
library(tidyverse)

Para obtener información sobre un paquete, puede utilizarse el parámetro help de library():

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

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 positivos y casos activos de Covid-19 en Costa Rica.

# Carga de datos desde un archivo CSV
cr_covid19 <- read.csv(file='https://raw.githubusercontent.com/pf0953-programaciongeoespacialr-2020/datos/master/covid19/casos/cr/2020_09_08_CSV_GENERAL.csv')

# Gráfico
plot(cr_covid19$positivos, cr_covid19$activos)

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

# Gráfico con parámetros adicionales de plot()
plot(
  cr_covid19$positivos, 
  cr_covid19$activos,
  main='Relación entre casos positivos y activos de COVID-19 en CR',
  xlab='Casos positivos',
  ylab='Casos activos'
)

Para incluir la incluir la columna con la fecha, esta debe convertirse primero a la clase Date.

# Conversión de la columna de fecha a la clase Date
cr_covid19$FECHA <- as.Date(cr_covid19$FECHA, "%d/%m/%Y")

# Gráfico con fechas
plot(
  cr_covid19$FECHA, 
  cr_covid19$positivos,
  main='Evolución en el tiempo de los casos positivos de COVID-19 en CR',
  xlab='Fecha',
  ylab='Casos positivos'
)

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

# Gráfico con fechas
ggplot(cr_covid19, aes(x = FECHA, y = positivos)) +
  ggtitle('Evolución en el tiempo de los casos positivos de COVID-19 en CR') +
  xlab('Fecha') +
  ylab('Casos positivos') +
  geom_point()

La manera usual de usar ggplot() es con un data frame como argumento, especificando cuales columnas usar como valores de x e y. La primera parte, ggplot(), 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".

# Gráfico de líneas
plot(
  cr_covid19$FECHA, 
  cr_covid19$positivos,
  main='Evolución en el tiempo de los casos positivos de COVID-19 en CR',
  xlab='Fecha',
  ylab='Casos positivos',
  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().

# Gráfico de línea de casos positivos
plot(
  cr_covid19$FECHA, 
  cr_covid19$positivos,
  main='Evolución en el tiempo de los casos de COVID-19 en CR',
  xlab='Fecha',
  ylab='Casos',
  type="l",
  col="blue"
)

# Casos activos
lines(cr_covid19$FECHA, cr_covid19$activos, col="red")

# Casos recuperados
lines(cr_covid19$FECHA, cr_covid19$RECUPERADOS, col="green")

# Casos fallecidos
lines(cr_covid19$FECHA, cr_covid19$fallecidos, col="violet")

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().

# Gráfico de líneas de casos de COVID-19 en Costa Rica
ggplot(cr_covid19, aes(x=FECHA)) + 
  ggtitle("Evolución en el tiempo de los casos de COVID-19 en CR") +
  xlab("Fecha") + 
  ylab("Casos") +
  geom_line(aes(y = positivos), color = "blue") +
  geom_point(aes(y = positivos), color = "blue") + 
  geom_line(aes(y = activos), color = "red") +
  geom_point(aes(y = activos), color = "red") +   
  geom_line(aes(y = RECUPERADOS), color="green") +
  geom_point(aes(y = RECUPERADOS), color = "green") +
  geom_line(aes(y = fallecidos), color="violet") +
  geom_point(aes(y = fallecidos), color = "violet")  

Versión del gráfico en plotly:

# Gráfico de líneas de casos de COVID-19 en Costa Rica
plot_ly(data = cr_covid19,
                x = ~ FECHA,
                y = ~ positivos, 
                name = 'Positivos', 
                type = 'scatter',
                mode = 'lines',
                line = list(color = "blue")) %>%
  add_trace(y = ~ activos,
                    name = 'Activos',
                    mode = 'lines',
                    line = list(color = "red")) %>%
  add_trace(y = ~ RECUPERADOS,
                    name = 'Recuperados',
                    mode = 'lines',
                    line = list(color = "green")) %>%
  add_trace(y = ~ fallecidos,
                    name = 'Fallecidos',
                    mode = 'lines',
                    line = list(color = "violet")) %>%  
  layout(title = "",
                 yaxis = list(title = "Cantidad de casos"),
                 xaxis = list(title = "Fecha"),
                 legend = list(x = 0.1, y = 0.9),
                 hovermode = "compare")

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_positivos.ordenado <- order(ca_covid19$positivos, decreasing=TRUE)

# Nuevo data frame ordenado
ca_covid19.positivos <- ca_covid19[ca_positivos.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.positivos$positivos, 
  names.arg=ca_covid19.positivos$pais, 
  xlab="País", 
  ylab="Casos positivos", 
  main="Casos positivos 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, -positivos), y=positivos)) +
  ggtitle("Casos positivos de COVID-19 en Centroamérica y DOM") +
  xlab("País") + 
  ylab("Casos positivos") +  
  geom_col() +
  geom_text(aes(label=positivos), 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.