El código fuente de este documento está disponible en https://github.com/pf0953-programaciongeoespacialr-2020/leccion-04-r-graficacion.
Sitio web del curso: PF-0953: Programación geoespacial en R.
Datos utilizados durante el curso: PF-0953: Programación geoespacial en R.
Sitio web sobre visualización de datos: From data to Viz | Find the graphic you need.
Documentación y manuales de R: R Documentation and manuals - R Documentation.
Documentación de paquetes y funciones de R: R Package Documentation.
Guía de instalación de paquetes de R: R Packages: A Beginner’s Guide.
Video sobre instalación de paquetes en R: How to install packages in R and RStudio?.
Sitio oficial de graphics: The R Graphics Package.
Sitio oficial de dplyr: A Grammar of Data Manipulation - dplyr.
Sitio oficial de ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics - ggplot2.
Se recomienda leer el capítulo 2 del libro R Graphics Cookbook, de Winston Chang.
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)
R provee varios paquetes (i.e. bibliotecas de funciones) para generar gráficos. Aquí se estudiarán tres:
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")
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.
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")
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.