Datos utilizados durante el curso: Datos del curso GF-0604: Procesamiento de datos geográficos
Sitio sobre visualización de datos: From data to Viz | Find the graphic you need
R es un lenguaje de programación enfocado en análisis estadístico. Es ampliamente utilizado en diversas áreas de investigación, entre las que pueden mencionarse aprendizaje automático (machine learning), ciencia de datos y big data, con aplicaciones en campos como biomedicina, bioinformática y finanzas, entre muchos otros. Fue creado por Ross Ihaka y Robert Gentleman en la Universidad de Auckland, Nueva Zelanda, en 1993.
Algunas de las principales características de este lenguaje son:
R es un proyecto de software libre que se comparte mediante una licencia GNU General Public Licence (GNU GPL). Esta característica permite que la funcionalidad original de R pueda ser ampliada mediante bibliotecas o paquetes desarrollados por la comunidad de programadores.
Para programar en R, puede utilizarse una interfaz de línea de comandos y también ambientes de desarrollo integrados (IDE, integrated development environment) como Jupyter o RStudio.
R, al igual que otros lenguajes de programación, estructura su funcionalidad por medio de segmentos de código llamados funciones. Cada función realiza una tarea específica como, por ejemplo, un cálculo matemático. Todas las funciones tienen un nombre y un conjunto de parámetros que especifican los datos de entrada que procesa la función. Los parámetros se escriben entre paréntesis redondos (()
) y estos siempre deben incluirse, aún en el caso de que la función no tenga ningún parámetro. Si la función tiene varios parámetros, deben separarse mediante comas (,
).
Por ejemplo, la función print()
recibe como parámetro un valor (ej. un texto o un número) para imprimirlo en la pantalla. En el siguiente fragmento de código en R, se utiliza print()
para imprimir la hilera “Hola mundo”. Nótese el uso del símbolo #
para comentarios (i.e. texto que no es código ejecutable).
# Impresión de una hilera de carácteres
print("Hola mundo")
## [1] "Hola mundo"
La función mean()
retorna la media aritmética del parámetro de entrada. En el siguiente ejemplo, se calcula la media de los números de un vector creado a su vez con la función c()
.
# Media aritmética
mean(c(2, 4, 5, 9))
## [1] 5
La función getwd()
(get working directory) retorna la ruta del directorio de trabajo de la sesión actual de R. Este es el directorio en el cual R espera encontrar, por ejemplo, archivos de datos.
# Consultar directorio de trabajo
getwd()
## [1] "/home/mfvargas/geogrocesamiento-2020i/lecciones/leccion-04-r"
La función setwd()
(set working directory) establece la ruta del directorio de trabajo de la sesión actual de R. Como parámetro, recibe una hilera de texto con la ruta.
# Establecer directorio de trabajo (la ruta debe existir)
# setwd("/home/mfvargas/geogrocesamiento-2020i/lecciones/leccion-04-r")
Los parámetros de las funciones tienen nombres que pueden especificarse en caso de ser necesario. En el siguiente ejemplo, se utilizan los nombres de los parámetros x
, xlab
y ylab
de la función plot()
para especificar la fuente de datos y las etiquetas de los ejes x e y de un gráfico.
# Gráfico con etiquetas en los ejes x e y
plot(
x=cars,
xlab="Velocidad",
ylab="Distancia"
)
Para obtener ayuda de una función desde la línea de comandos de R, puede utilizarse un signo de pregunta (?
) seguido del nombre de la función. Por ejemplo:
# Ayuda de la función setwd()
?setwd
También puede obtenerse ayuda sobre una función en los buscadores de Internet (ej. Google), además de ejemplos y otros materiales de apoyo.
Las funciones de R se agrupan en conjuntos llamados bibliotecas, las cuales se distribuyen en paquetes. Para utilizar un paquete, este debe cargarse primero con la función require()
.
# Carga del paquete stats
require(stats)
R puede trabajar con varios tipos de datos, entre los que están números, carácteres (i.e. textos) y booleanos (o lógicos). También utiliza tipos más complejos, como vectores y matrices.
Como se mencionó anteriormente, R es un lenguaje de programación orientado a objetos. Un objeto es una entidad que tiene asociadas propiedades y métodos para manipular esas propiedades. Un objeto puede ser, por ejemplo, un número, un texto, un vector o una matriz.
Hay muchas formas de crear objetos en R. Una de las más sencillas es con los operadores de asignación. Estos son =
y <-
. Las siguientes sentencias crean un número, un texto y un vector.
# Número
x <- 10
# Hilera de carácteres
nombre <- 'Manuel'
# Vector de hileras de carácteres
dias <- c('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado')
Tanto x
, como nombre
como dias
son variables. Una variable es una etiqueta que se le asigna a un valor (o a un objeto). Una variable tiene un nombre que debe comenzar con una letra.
El tipo de una variable (u objeto) puede consultarse con la función typeof()
. Por ejemplo:
print(typeof(x))
## [1] "double"
print(typeof(nombre))
## [1] "character"
A continuación, se describen con más detalle algunos de los tipos de datos utilizados en el lenguaje R.
Pueden ser enteros o fracciones. Se utilizan en operaciones aritméticas (ej. suma, resta, multiplicación, división).
# Números enteros
x <- 10
y <- 20
# Suma
print(x + y)
## [1] 30
# Números decimales
x <- 0.5
y <- 3.14
# Multiplicación
print(x * y)
## [1] 1,57
Se utilizan para representar textos. Deben estar encerrados entre comillas simples '
o dobles "
.
# Hileras de carácteres
nombre <- "María"
apellido <- "Pérez"
# Concatenación
print(paste(nombre, apellido))
## [1] "María Pérez"
Los objetos booleanos (también llamados lógicos) tienen dos posibles valores: verdadero (TRUE
) o falso (FALSE
).
# Variable booleana
b = 1 < 2
print(b)
## [1] TRUE
# Variable booleana
c = 1 > 2
print(c)
## [1] FALSE
Las expresiones booleanas pueden combinarse con operadores como:
&
(Y, en inglés AND)|
(O, en inglés OR)!
(NO, en inglés NOT)# Operador lógico AND
print((1 < 2) & (3 < 4))
## [1] TRUE
# Operador lógico OR
print((2 + 2 == 5) | (20 <= 10))
## [1] FALSE
# Operador lógico NOT
print(!(2 + 2 == 5))
## [1] TRUE
Un vector es una estructura de una dimensión que combina objetos del mismo tipo. Se crean con la función c()
(del inglés combine), como en los siguientes ejemplos:
# Definición de un vector de números
a = c(1, 2, 3, 4, 5)
print(a)
## [1] 1 2 3 4 5
# Definición de un vector de hileras de carácteres
b = c("Álvaro", "Ana", "Berta", "Bernardo")
print(b)
## [1] "Álvaro" "Ana" "Berta" "Bernardo"
Los data frames son estructuras bidimensionales compuestas por varios vectores, de manera similar a una matriz. Cada vector corresponde una columna de la matriz.
La función data.frame()
puede utilizarse para crear un data frame a partir de vectores que serán las columnas del data frame.
# Vector de nombres de países
paises = c("PAN", "CRI", "NIC", "SLV", "HND", "GTM", "BLZ", "DOM")
# Vector de cantidades de habitantes (en millones)
poblaciones = c(4.1, 5.0, 6.2, 6.4, 9.2, 16.9, 0.3, 10.6)
# Creación de un data frame a partir de los dos vectores
ca_poblacion_paises = data.frame(
pais = paises,
poblacion = poblaciones
)
print(ca_poblacion_paises)
## pais poblacion
## 1 PAN 4,1
## 2 CRI 5,0
## 3 NIC 6,2
## 4 SLV 6,4
## 5 HND 9,2
## 6 GTM 16,9
## 7 BLZ 0,3
## 8 DOM 10,6
La función summary()
proporciona un resumen de los contenidos de un data frame:
# Resumen de los contenidos del data frame
print(summary(ca_poblacion_paises))
## pais poblacion
## BLZ :1 Min. : 0,300
## CRI :1 1st Qu.: 4,775
## DOM :1 Median : 6,300
## GTM :1 Mean : 7,338
## HND :1 3rd Qu.: 9,550
## NIC :1 Max. :16,900
## (Other):2
Nota: para efectos de pruebas y ejemplos, el interpretador de R incorpora varios conjuntos de datos en la forma de data frames que pueden listarse con la función data()
. Para consultar un conjunto en particular, puede utilizarse el operador ?
desde la línea de comandos de R (ej. ?cars
).
Por lo general, los datos con los que se trabaja en R provienen de fuentes externas, como archivos, bases de datos o servicios web. A continuación, se estudiarán funciones que permiten importar datos desde algunas de estas fuentes.
La función read.csv()
importa datos desde un archivo de valores separados por comas (CSV, comma separated values) y los almacena en un data frame. Como parámetro, recibe la ruta del archivo. Si la ruta no es absoluta, se toma como relativa al directorio actual de trabajo.
Ejemplo: casos de Covid-19 en los países centroamericanos y República Dominicana
Los datos usados en este ejemplo están basados en los publicados por el Centro de Coordinación para la Prevención de los Desastres en América Central y República Dominicana (Cepredenac).
# Importación de casos recuperados, fallecidos, activos y confirmados de Covid-19 en los países de Centroamérica
ca_covid19 <- read.csv(file='datos/covid19/casos/ca/ca-covid19.csv')
print(ca_covid19)
## pais recuperados fallecidos activos confirmados
## 1 BLZ 0 2 16 18
## 2 CRI 67 4 555 626
## 3 GTM 19 5 172 196
## 4 HND 9 35 382 426
## 5 NIC 5 1 3 9
## 6 PAN 75 103 3573 3751
## 7 SLV 30 6 123 159
## 8 DOM 208 189 3217 3614
Ejemplo: índice de movilidad durante la pandemia de Covid-19
Los siguientes ejemplos están basados en el Índice de movilidad de Citymapper, el cual mide la movilidad en varias ciudades del mundo durante la pandemia de Covid-19.
# Carga de los datos de todas las ciudades desde un archivo almacenado en la Web
indice_movilidad <- read.csv(file='https://raw.githubusercontent.com/geoprocesamiento-2020i/datos/master/covid19/movilidad/citymapper/Citymapper_Mobility_Index.csv')
# Resumen
print(summary(indice_movilidad))
## Date Amsterdam Barcelona Berlin
## 2020-03-02: 1 Min. :0,0400 Min. :0,0200 Min. :0,0800
## 2020-03-03: 1 1st Qu.:0,0600 1st Qu.:0,0300 1st Qu.:0,1100
## 2020-03-04: 1 Median :0,0700 Median :0,0400 Median :0,1300
## 2020-03-05: 1 Mean :0,3227 Mean :0,2902 Mean :0,3516
## 2020-03-06: 1 3rd Qu.:0,6000 3rd Qu.:0,4700 3rd Qu.:0,6000
## 2020-03-07: 1 Max. :1,1000 Max. :1,1300 Max. :1,0300
## (Other) :39
## Birmingham Boston Brussels Chicago
## Min. :0,1000 Min. :0,0400 Min. :0,05 Min. :0,0500
## 1st Qu.:0,1300 1st Qu.:0,0600 1st Qu.:0,07 1st Qu.:0,0700
## Median :0,2100 Median :0,0800 Median :0,08 Median :0,0900
## Mean :0,4424 Mean :0,3038 Mean :0,34 Mean :0,3438
## 3rd Qu.:0,8900 3rd Qu.:0,4900 3rd Qu.:0,68 3rd Qu.:0,6600
## Max. :1,1100 Max. :1,0200 Max. :1,13 Max. :1,0900
##
## Copenhagen Hamburg Hong.Kong Istanbul
## Min. :0,0700 Min. :0,0900 Min. :0,2600 Min. :0,0400
## 1st Qu.:0,0900 1st Qu.:0,1200 1st Qu.:0,3400 1st Qu.:0,0800
## Median :0,1100 Median :0,1500 Median :0,4200 Median :0,1000
## Mean :0,3173 Mean :0,3356 Mean :0,4256 Mean :0,4187
## 3rd Qu.:0,3100 3rd Qu.:0,5900 3rd Qu.:0,5200 3rd Qu.:0,8900
## Max. :1,1100 Max. :0,9400 Max. :0,5600 Max. :1,4400
##
## Lisbon London Los.Angeles Lyon
## Min. :0,0800 Min. :0,0700 Min. :0,0600 Min. :0,0300
## 1st Qu.:0,1000 1st Qu.:0,0900 1st Qu.:0,1000 1st Qu.:0,0400
## Median :0,1200 Median :0,1500 Median :0,1300 Median :0,0400
## Mean :0,4118 Mean :0,3924 Mean :0,3593 Mean :0,2964
## 3rd Qu.:0,6800 3rd Qu.:0,7500 3rd Qu.:0,5600 3rd Qu.:0,7500
## Max. :1,2800 Max. :1,0200 Max. :1,1000 Max. :0,9900
##
## Madrid Manchester Melbourne Mexico.City
## Min. :0,0300 Min. :0,0800 Min. :0,090 Min. :0,0700
## 1st Qu.:0,0400 1st Qu.:0,1000 1st Qu.:0,140 1st Qu.:0,1300
## Median :0,0400 Median :0,1600 Median :0,250 Median :0,2800
## Mean :0,2587 Mean :0,4189 Mean :0,484 Mean :0,4711
## 3rd Qu.:0,2300 3rd Qu.:0,8800 3rd Qu.:0,930 3rd Qu.:0,9100
## Max. :1,0700 Max. :1,0800 Max. :1,140 Max. :1,3200
##
## Milan Monaco Montréal Moscow
## Min. :0,02000 Min. :0,0200 Min. :0,0800 Min. :0,1200
## 1st Qu.:0,03000 1st Qu.:0,0500 1st Qu.:0,1100 1st Qu.:0,1600
## Median :0,04000 Median :0,0700 Median :0,1600 Median :0,5400
## Mean :0,09711 Mean :0,2391 Mean :0,4113 Mean :0,5487
## 3rd Qu.:0,07000 3rd Qu.:0,5000 3rd Qu.:0,8700 3rd Qu.:0,9500
## Max. :0,45000 Max. :0,8200 Max. :1,1400 Max. :1,1700
##
## New.York.City Paris Philadelphia Rhine.Ruhr
## Min. :0,0500 Min. :0,0400 Min. :0,100 Min. :0,1100
## 1st Qu.:0,0600 1st Qu.:0,0500 1st Qu.:0,120 1st Qu.:0,1500
## Median :0,0800 Median :0,0600 Median :0,150 Median :0,1600
## Mean :0,3233 Mean :0,3151 Mean :0,358 Mean :0,3298
## 3rd Qu.:0,5400 3rd Qu.:0,7400 3rd Qu.:0,570 3rd Qu.:0,5200
## Max. :1,0400 Max. :1,0100 Max. :1,030 Max. :0,8600
##
## Rome San.Francisco Seattle Seoul
## Min. :0,0300 Min. :0,0400 Min. :0,0500 Min. :0,3400
## 1st Qu.:0,0400 1st Qu.:0,0600 1st Qu.:0,0800 1st Qu.:0,3600
## Median :0,0500 Median :0,0800 Median :0,1200 Median :0,3800
## Mean :0,1744 Mean :0,2871 Mean :0,2669 Mean :0,4007
## 3rd Qu.:0,0800 3rd Qu.:0,4900 3rd Qu.:0,4200 3rd Qu.:0,4300
## Max. :0,9700 Max. :1,0000 Max. :0,8300 Max. :0,5200
##
## Singapore St..Petersburg Stockholm Sydney
## Min. :0,1200 Min. :0,1700 Min. :0,230 Min. :0,1000
## 1st Qu.:0,5000 1st Qu.:0,2800 1st Qu.:0,280 1st Qu.:0,1400
## Median :0,6300 Median :0,6500 Median :0,300 Median :0,2300
## Mean :0,6013 Mean :0,6356 Mean :0,476 Mean :0,4813
## 3rd Qu.:0,8400 3rd Qu.:0,9800 3rd Qu.:0,660 3rd Qu.:0,9200
## Max. :0,9500 Max. :1,2500 Max. :1,060 Max. :1,2100
##
## São.Paulo Tokyo Toronto Vancouver
## Min. :0,0800 Min. :0,050 Min. :0,1200 Min. :0,1300
## 1st Qu.:0,1200 1st Qu.:0,090 1st Qu.:0,1600 1st Qu.:0,1500
## Median :0,1400 Median :0,180 Median :0,2200 Median :0,1800
## Mean :0,4473 Mean :0,278 Mean :0,4298 Mean :0,4204
## 3rd Qu.:0,9600 3rd Qu.:0,460 3rd Qu.:0,7800 3rd Qu.:0,7600
## Max. :1,2000 Max. :0,630 Max. :1,0900 Max. :1,0200
##
## Vienna Washington.DC
## Min. :0,0300 Min. :0,0400
## 1st Qu.:0,0500 1st Qu.:0,0500
## Median :0,0600 Median :0,0800
## Mean :0,3447 Mean :0,3089
## 3rd Qu.:0,5100 3rd Qu.:0,5400
## Max. :1,3400 Max. :1,0200
##
Para visualizar mejor el data frame, es posible imprimir filas o columnas específicas:
# Primera fila (2020-03-02) de las primeras cinco ciudades
print(indice_movilidad[c(1), c(1, 2, 3, 4, 5, 6)])
## Date Amsterdam Barcelona Berlin Birmingham Boston
## 1 2020-03-02 1,1 1,13 1,03 1 0,97
# Todas las filas de las columnas 1 (Date), 3 (Barcelona), 4 (Berlín), 20 (México DF), 21 (Milán) y 32 (Seúl)
print(indice_movilidad[, c(1, 3, 4, 20, 21, 32)])
## Date Barcelona Berlin Mexico.City Milan Seoul
## 1 2020-03-02 1,13 1,03 1,14 0,45 0,52
## 2 2020-03-03 1,05 0,94 1,11 0,44 0,51
## 3 2020-03-04 1,05 0,93 1,09 0,43 0,48
## 4 2020-03-05 1,06 0,92 1,08 0,39 0,46
## 5 2020-03-06 1,05 0,92 1,09 0,37 0,46
## 6 2020-03-07 1,10 0,92 1,15 0,34 0,43
## 7 2020-03-08 1,07 0,97 1,32 0,23 0,51
## 8 2020-03-09 1,04 0,94 0,74 0,19 0,46
## 9 2020-03-10 0,92 0,83 0,95 0,13 0,41
## 10 2020-03-11 0,86 0,86 1,10 0,10 0,43
## 11 2020-03-12 0,69 0,72 1,02 0,07 0,45
## 12 2020-03-13 0,47 0,60 1,01 0,06 0,41
## 13 2020-03-14 0,24 0,54 0,91 0,05 0,40
## 14 2020-03-15 0,16 0,45 0,82 0,05 0,38
## 15 2020-03-16 0,12 0,41 0,43 0,07 0,44
## 16 2020-03-17 0,08 0,28 0,62 0,06 0,40
## 17 2020-03-18 0,06 0,26 0,53 0,05 0,41
## 18 2020-03-19 0,05 0,18 0,48 0,04 0,36
## 19 2020-03-20 0,05 0,13 0,42 0,04 0,44
## 20 2020-03-21 0,04 0,12 0,31 0,03 0,39
## 21 2020-03-22 0,03 0,11 0,28 0,03 0,38
## 22 2020-03-23 0,05 0,13 0,30 0,04 0,36
## 23 2020-03-24 0,04 0,12 0,29 0,04 0,36
## 24 2020-03-25 0,04 0,12 0,23 0,03 0,37
## 25 2020-03-26 0,03 0,11 0,21 0,03 0,36
## 26 2020-03-27 0,03 0,10 0,18 0,03 0,37
## 27 2020-03-28 0,03 0,10 0,16 0,02 0,36
## 28 2020-03-29 0,03 0,08 0,15 0,03 0,35
## 29 2020-03-30 0,04 0,12 0,18 0,04 0,38
## 30 2020-03-31 0,03 0,12 0,17 0,03 0,36
## 31 2020-04-01 0,03 0,12 0,15 0,03 0,37
## 32 2020-04-02 0,03 0,11 0,14 0,03 0,37
## 33 2020-04-03 0,02 0,10 0,13 0,03 0,42
## 34 2020-04-04 0,02 0,10 0,11 0,03 0,39
## 35 2020-04-05 0,02 0,11 0,11 0,03 0,34
## 36 2020-04-06 0,03 0,14 0,13 0,04 0,36
## 37 2020-04-07 0,03 0,12 0,13 0,03 0,37
## 38 2020-04-08 0,03 0,14 0,13 0,03 0,36
## 39 2020-04-09 0,03 0,13 0,09 0,03 0,38
## 40 2020-04-10 0,02 0,10 0,07 0,03 0,41
## 41 2020-04-11 0,03 0,11 0,08 0,03 0,38
## 42 2020-04-12 0,02 0,14 0,10 0,02 0,34
## 43 2020-04-13 0,03 0,09 0,13 0,03 0,36
## 44 2020-04-14 0,04 0,12 0,12 0,04 0,40
## 45 2020-04-15 0,04 0,13 0,11 0,03 0,38
Una de las principales fortalezas de R es su capacidad para generar gráficos estadísticos. A continuación, se detallan algunas de las principales funciones de graficación.
barplot()
genera un gráfico de barras. Este tipo de gráfico se utiliza para mostrar la relación entre una variable categórica y una variable numérica. Cada valor de la variable categórica se representa mediante una barra y el tamaño de la barra corresponde al valor correspondiente de la variable numérica.
Ejemplo: población de países centroamericanos
En los siguientes ejemplos, se grafican las cantidades de habitantes de los países centroamericanos. El gráfico resultante se mejora paulatinamente con las opciones que ofrece la función barplot()
.
Primero, se repiten los comandos para construir un data frame a partir de dos vectores.
# Vector de nombres de países
paises = c("PAN", "CRI", "NIC", "SLV", "HND", "GTM", "BLZ", "DOM")
# Vector de cantidades de habitantes (en millones)
poblaciones = c(4.1, 5.0, 6.2, 6.4, 9.2, 16.9, 0.3, 10.6)
# Creación de un data frame a partir de los dos vectores
ca_poblacion_paises = data.frame(
pais = paises,
poblacion = poblaciones
)
print(ca_poblacion_paises)
## pais poblacion
## 1 PAN 4,1
## 2 CRI 5,0
## 3 NIC 6,2
## 4 SLV 6,4
## 5 HND 9,2
## 6 GTM 16,9
## 7 BLZ 0,3
## 8 DOM 10,6
Gráfico básico
(Note la notación con $
para especificar columnas)
barplot(height=ca_poblacion_paises$poblacion)
Seguidamente, se ordenan los valores de población con la función order()
y se genera un nuevo data frame.
# Ordenar de mayor a menor
poblacion.ordenado <- order(ca_poblacion_paises$poblacion, decreasing=TRUE)
# Nuevo data frame ordenado
ca_poblacion_paises.poblacion <- ca_poblacion_paises[poblacion.ordenado,]
Gráfico con título y etiquetas
barplot(
height=ca_poblacion_paises.poblacion$poblacion,
names.arg=ca_poblacion_paises.poblacion$pais,
xlab="País",
ylab="Millones de habitantes",
main="Población de los países centroamericanos y República Dominicana"
)
Gráfico con barras horizontales
barplot(
height=ca_poblacion_paises.poblacion$poblacion,
names.arg=ca_poblacion_paises.poblacion$pais,
xlab="Millones de habitantes",
ylab="País",
main="Población de los países centroamericanos y República Dominicana",
horiz=TRUE
)
Ejemplo: casos de Covid-19 en los países centroamericanos y República Dominicana
En este caso, el archivo CSV se carga desde la Web en un data frame:
# Importación de casos recuperados, fallecidos, activos y confirmados de Covid-19 en los países de Centroamérica
ca_covid19 <- read.csv(file='https://raw.githubusercontent.com/geoprocesamiento-2020i/datos/master/covid19/casos/ca/ca-covid19.csv')
print(ca_covid19)
## pais recuperados fallecidos activos confirmados
## 1 BLZ 0 2 16 18
## 2 CRI 67 4 555 626
## 3 GTM 19 5 172 196
## 4 HND 9 35 382 426
## 5 NIC 5 1 3 9
## 6 PAN 75 103 3573 3751
## 7 SLV 30 6 123 159
## 8 DOM 208 189 3217 3614
Ordenamiento según cantidad de casos confirmados
# Ordenar de mayor a menor
confirmados.ordenado <- order(ca_covid19$confirmados, decreasing=TRUE)
# Nuevo data frame ordenado
ca_covid19.confirmados <- ca_covid19[confirmados.ordenado,]
Gráfico de 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 países centroamericanos y DOM"
)