La gran variedad (y actulización constante) de métodos estadísticos se ha valido de los lenguajes de programación de acceso libre para hacerla accesible a toda la comunidad científica y profesional. Un listado reciente de estos lenguajes son R, Python, Julia, C++, etc. En este texto trataremos el manejo de lenguaje R en el entorno de desarrollo integrado (IDE).
Lenguaje de programación muy usado en estudios científicos con grandes cantidades de datos, reconocido en la rama de la inteligencia artificial, investigaciones biomética, minería de datos, bioinformática y las finanzas. Además brinda la posibilidad de cargar diferentes paquetes con mútiples funcionalidades de cálculo y graficación. Para poder descargar el software puede acceder al sitio web oficial: https://www.r-project.org/, en la sección Download puede darle clic en CRAN (Comprehensive R Archive Network) donde tiene la opción de elegir un repositorio de descarga según su zona de preferencia. Cualquiera de estos repositorios le direccionará a enlaces de descarga del programa según su sistema operativo (macOS, Windows, Linux), si accede a la descarga para Windows le llevara al enlace “install R for the first time” y finalmente se muestra el enlace “Download R-4.2.1 for Windows” cuya version dependerá del momento de descarga.
RStudio es un entorno integrado que desarrolla el lenguaje de programación R (IDE), orientado a la estadística computacional y dashboard. Incluye una consola, editor de síntaxis que apoya la ejecución de los códigos, así como herramientas para el trazado, depuración y gestión del espacio de trabajo. Para poder descargar el software puede acceder al sitio web oficial: https://www.rstudio.com/, dar clic en el boton “Download” y descargar la version Free de “RStudio Desktop”.
Se mostrará aspectos básicos para el conocimiento del lenguaje R, del cual existen una gran variedad de recursos en online (videos, pdf, bookdown, etc).
Un objeto, básicamente es un elemento que almacena datos (información) y que permite interactuar y/o realizar operaciones matemáticas/estadísticas con él.
a <- 3
b <- 5
a+b
## [1] 8
c <- a+b
sqrt(c)
## [1] 2.828427
Estos objetos pueden tener una extensión mas útil para ampliar y
facilitar el trabajo. Podemos concatenar con c()
varios
datos:
a <- c(1,2,3)
b <- c(4,5,6)
a+b
## [1] 5 7 9
Se puede unir estos vectores para conformar uno nuevo:
x <- c(a,b)
x
## [1] 1 2 3 4 5 6
Si sumamos (por ejemplo) los vectores a
e
y
, evidentemente tendremos un mensaje de alerta que, como
se puede ver, es por la diferencia de longitud de los vectores. R de
todas formas realiza la operación, pero debemos tener cuidado con
ello:
a <- c(1,2,3)
y <- c(2,2,2,2)
# ejecute: a+y, le mostrará un mensaje de alerta
Para verificar la longitud de los vectores puede usar
length()
length(a)
## [1] 3
length(y)
## [1] 4
En R podemos generar vectores a partir de secuencias. Se puede usar
a:b
o seq()
para mayores especificaciones:
x <- 1:10
x <- c(1:10)
probemos la función seq()
x <- seq(from=1,to = 10,by = 2)
x
## [1] 1 3 5 7 9
La función rep()
permite generar repeticiones de
valores:
x <- rep(x = 1, times=5)
x
## [1] 1 1 1 1 1
y <- rep(x = "A", times=5)
y
## [1] "A" "A" "A" "A" "A"
también podemos generar repeticiones de valores concatenados (vectores):
x <- rep(c(1,2,3),3)
x
## [1] 1 2 3 1 2 3 1 2 3
y <- rep(c("a","b","c"),3)
y
## [1] "a" "b" "c" "a" "b" "c" "a" "b" "c"
Usando función sample()
x <- sample(x = 1:30, size = 5, replace = F)
x
## [1] 20 21 23 24 13
Usando función rnorm()
(Números aleatorios con
Distribución Normal)
x <- rnorm(n = 5,mean = 12,sd = 5)
x
## [1] 6.784405 13.554137 14.655938 9.347326 15.299037
Ya que vemos que muestra números con muchos decimales, aprovechemos
en usar la función round()
para aprender a redondear
nuestros resultados:
x <- round(rnorm(n = 5,mean = 12,sd = 5), 2)
x
## [1] 3.69 9.26 -4.52 19.55 8.55
Es posible crear matrices con la función matrix()
:
mx <- matrix(data = c(1,2,3,4,5,6),
nrow = 2,
ncol = 3,
byrow = T)
mx
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
si probamos cambiar la opción byrow=F
veremos lo
siguiente:
mx <- matrix(data = c(1,2,3,4,5,6),
nrow = 2,
ncol = 3,
byrow = F)
mx
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
Se puede unir vectores y generar una matriz con la función
cbind()
o rbind()
:
a <- c(1,2,3)
b <- c(4,5,6)
c <- c(7,8,9)
mc <- cbind(a,b,c)
mr <- rbind(a,b,c)
# Observemos ambos resultados:
mc
## a b c
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
mr
## [,1] [,2] [,3]
## a 1 2 3
## b 4 5 6
## c 7 8 9
matX <- matrix(1:25,5,5)
matX
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 6 11 16 21
## [2,] 2 7 12 17 22
## [3,] 3 8 13 18 23
## [4,] 4 9 14 19 24
## [5,] 5 10 15 20 25
Ocasionalmente necesitamos seleccionar una partición de la matriz.
Para ello utilizamos los corchetes de la siguiente forma:
matriz[,]
, por ejemplo, si deseamos seleccionar el elemento
de la fila 2, columna 3, codificamos matriz[2,3]
, si
queremos unicamente las dos primeras columnas codificamos
matriz[,1:2]
. En resumen, colocamos las filas a la
izquierda y columnas a la derecha de la “,” (coma) en el interior de los
corchetes:
matX[1,2]
## [1] 6
matX[1:2,1:2]
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
matX[1:2,c(1,3,4)]
## [,1] [,2] [,3]
## [1,] 1 11 16
## [2,] 2 12 17
matX[,1:2]
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
## [5,] 5 10
matX[1:2,]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 6 11 16 21
## [2,] 2 7 12 17 22
Para ello creamos algunas matrices:
matA <- matrix(data = c(1,2,3,4),
nrow = 2,
ncol = 2,
byrow = T)
matB <- matrix(data = c(3,6,3,4),
nrow = 2,
ncol = 2,
byrow = T)
Suma
matA+matB
## [,1] [,2]
## [1,] 4 8
## [2,] 6 8
Resta
matA-matB
## [,1] [,2]
## [1,] -2 -4
## [2,] 0 0
Producto
matA%*%matB
## [,1] [,2]
## [1,] 9 14
## [2,] 21 34
Otras operaciones útiles
t(matA)
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
det(matA)
## [1] -2
solve(matA)
## [,1] [,2]
## [1,] -2.0 1.0
## [2,] 1.5 -0.5
diag(matA)
## [1] 1 4
sum(diag(matA))
## [1] 5
colSums(matA)
## [1] 4 6
rowSums(matA)
## [1] 3 7
El objeto data.frame()
es aquel que genera la típica
tabla de datos que almacena todo tipo de datos (cuantitativos y
cualitativos):
x1 <- 1:5
x2 <- sample(20:100,10,replace = F)
x3 <- c(rep("Grupo A",5),rep("Grupo B",5))
x4 <- round(rnorm(n = 10,mean = 12,sd = 3),2)
datos <- data.frame(x1,x2,x3,x4)
datos
Es posible importar datos de diversos formatos ( *.txt
,
*.csv
, *.xlsx
, *.sav
, etc)
provenientes de los programas “bloc de notas”, “Ms Excel”, “SPSS”,
“SAS”, “Stata”, etc. Por ejemplo, para importar datos desde un bloc de
notas que tiene ficheros *.txt
usamos la función
read.table()
. El usuario debe considerar que este tipo de
fichero es mas ligero respecto a otros, y que, para fines
introductorios, se abordará ejemplos para estos ficheros.
Primero:
Vamos a importar los datos "contaminacion.txt"
C:\Users\LENOVO\Documents
Segundo:
Para ahorrar línea de código, usualmente se realiza un enrutamiento
previo de la ubicación de su archivo, es decir, se debe indicar el
directorio donde se encuentra el archivo
"contaminacion.txt"
, para ello puede seguir la siguiente
secuencia de menú en Rstudio:
Session\Set Working Diretory\Choose Directory
, hecho esto,
se abre una ventana donde se debe ubicar la carpeta
"\Documents"
(o cualquier otra carpeta donde haya guardado
el archivo) que contiene el archivo "contaminacion.txt"
. Lo
que se busca es seleccionar la carpeta, mas no los archivos (no se
podrán ver en la ventana)
Hecho esto, usaremos la función read.table()
agregando
los argumentos sep="\t"
y header=TRUE
. El
primero indica que las columnas están separadas por tabulaciones, y el
segundo, indica que la primera fila contiene el nombre de las columnas
(variables).
misdatos <- read.table("contaminacion.txt",sep="\t",header=TRUE)
Si digita en la consola el objeto misdatos
observará
toda la información, si digita View(misdatos)
observará los
datos en una nueva pestaña. Una opción mas práctica es usar
header()
que muestra por defecto las 6 primeras filas del
dataframe
.
head(misdatos)
RStudio tiene la opción de importar a travez del Menú
File\Import Dataset\
. Aquí encontrará opciones para: text,
Excel, SPSS, SAS, Stata.
Retornando a los códigos, existen librerias especializadas para
importar archivos: library(foreign)
,
library(readxl)
, library(openxlsx)
,
library(XLConnect)
, etc.
Probemos crear una nueva variable con n=20
datos
aleatorios con Distribución Normal con \(\mu=30\) y \(\sigma=3\), luego lo redondeamos con 2
dígitos:
set.seed(1) #punto de arranque de números aleatorios
mp25 <- round(rnorm(20,30,3),2)
se puede agregar a la tabla misdatos
y creamos otro
objeto llamado misdatos2
misdatos2 <- data.frame(mp25,misdatos)
head(misdatos2)
En este capítulo se mostrará como realizar graficos estadísticos haciendo uso de las funciones básicas de R, las variaciones que pueden hacerse con los parámetos de forma y color, el uso de librerias de paleta de colores. Por último se usará la libreria ggplot2 como alternativa importante de presentación de gráficos que ha ganado gran popularidad en la comunidad de usuarios R.
Existe una clasificación de las funciones gráficas, entre ellas, las funciones gráficas de alto nivel. Estas son funciones que generan gráficos completos, por ejemplo los gráficos de dispersión, histogramas, boxplot (caja y bigotes), etc.; en el interior de estas funciones se pueden agregar parámetros que permiten modificar o mejorar la presentación básica del gráfico.
La función plot()
admite de forma básica dos primeros
argumentos: x
,y
, que le corresponden a cada
variable de un dataframe
o vectores por separado. Sin
embargo, la función plot()
es muy versatil, dado que,
también se puede usar para mostrar otros gráficos especiales como mapas
de archivos shapefile.
Vamos a crear 2 variables aleatorias: varX
,
varY
; y las graficamos con la función plot()
.
Le agregaremos el argumento main=
para instertar un
título.
varX <- rnorm(30,0,1)
varY <- rnorm(30,0,1)
plot(x=varX,y=varY, main="mi primer gráfico")
Si respetamos el orden en que agregamos los argumentos, no es
necesario escribir los argumentos x=
, y=
.
Pruebe el siguiente código:
plot(varX,varY, main="mi primer gráfico")
La función hist()
permite mostrar gráficos de
histograma, que como se sabe, se realiza para variables cuantitativas
continuas. El argumentó básico que requiere es: x
. Veamos
el ejemplo:
varX <- rnorm(80,4,12)
hist(x=varX, main="mi primer histograma")
La función boxplot()
permite mostrar gráficos de caja y
bigotes, se realiza para variables cuantitativas continuas. El argumentó
básico que requiere es: x
. Veamos el ejemplo:
boxplot(varX, main="mi primer boxplot")
En este otro ejemplo unimos dos conjunto de datos en un solo vector y se puede identificar datos atípicos:
varX2 <- c(rnorm(80,4,12),rnorm(5,60,20))
boxplot(varX2, main="boxplot con datos atípicos")
Si queremos hacer un boxplot comparativo, se puede agregar
un segundo argumento “y
” de la siguiente manera:
boxplot(x~y)
. El símbolo ~
se obtiene de la
combinación de teclas ALT+126.
Para el siguiente ejemplo usaremos el data.frame
"misdatos"
de ejemplo de la sección \(\ref{sec:impdat}\).
Primero aplicamos la función attach()
para manipular de
forma independiente cada variable del data.frame “misdatos
”
y luego hacemos el gráfico:
attach(misdatos)
boxplot(mp10~estacion, main="mi segundo boxplot")
Como se puede apreciar la etiqueta de los ejes lleva por defecto los
mismos nombres de las columnas, pero estos se pueden modificar con los
argumentos: xlab
, ylab
; además, agregaremos
color con el parámetro “col
”. (Recuerde que cada parámetro
va separado por comas).
boxplot(mp10~estacion, main="Niveles contaminantes en zona norte",
xlab="Ciudad de monitoreo",
ylab="Material particulado 10um", col="yellow")
Es posible modificar el ancho de las cajas con el parámetro
“boxwex
”, dando valores proporcionales entre \([0,1]\); agregaremos colores para cada caja
y usaremos “horizontal=TRUE
” para girar las cajas (tener en
cuenta que debemos reubicar las etiquetas de los ejes):
boxplot(mp10~estacion, main="Niveles contaminantes en zona norte",
xlab="Material particulado 10um",
ylab="Ciudad de monitoreo", col=c("red","green"),
boxwex=0.5, horizontal = TRUE)
En este caso, son funciónes que permiten complementar (adicionar) nuevos elementos gráficos a la presentación gráfica principal. Por ejemplo, en un gráfico de dispersión es de interés agregar una línea que represente la recta de regresión lineal estimada, o puede ser necesario agregar algun texto o leyenda. A continuación se mostrará algunas funciones mas utilizadas.
La función points()
permite agregar puntos nuevos dentro
de cualquier gráfico principal (plot, boxplor, hist, etc).
En el siguiente ejemplo crearemos 2 variables aleatorias x, y para
luego realizar un gráfico de dispersión con puntos de color azul.
Finalmente, agregaremos un punto adicional con la función
points
, observe que la ubicación del punto está determinada
con las coordenadas (5,5) y es graficado de color rojo:
x <- rnorm(12,5,1)
y <- rnorm(12,5,1)
plot(x,y, main="usando points() - 1 punto", pch=16, col="blue")
# agregando puntos adicionales
points(x=5,y=5, pch=16, col="red", cex=2)
A este ejemplo podemos agregarle mas de nu punto de la siguiente manera:
plot(x,y, main="usando points() - 3 puntos", pch=16, col="blue")
xn <- c(4.5, 5, 5.5)
yn <- c(4.5, 5, 5.5)
points(xn,yn, pch=16, col="red", cex=2)
La función abline()
permite agregar rectas relacionadas
a funciones matemáticas, por ejemplo, agrear una recta lineal con
determinado intercepto y pendiente.
Para ejemplificar, realizaremos de forma simple una estimación de una ecuación de regresión y lo graficaremos en una dispersión.
plot(x,y, main="usando abline()", pch=16, col="blue")
# estimamos la recta de regresión lineal
recta <- lm(y~x)
abline(recta, col="red")
También es posible agrear rectas horizontales o verticales, dichas
rectas pueden presentarse de manera continua o segmentada probando las
opciones de tipo de linea con el argumento lty
:
plot(x,y, main="usando abline()", pch=16, col="blue")
# estimamos la recta de regresión lineal
recta <- lm(y~x)
abline(recta, col="red")
abline(h=6,v=6, lty="longdash")
Ambas funciones permiten agregar texto a un gráfico principal, pero se diferencian en la forma en que asegamos su ubicación en la zona del gráfico.
La función text()
requiere coordenadas para indicar la
posición en la que agregaremos el texto en el gráfico, por ejemplo:
plot(x,y, main="usando abline()", pch=16, col="blue")
# estimamos la recta de regresión lineal
recta <- lm(y~x)
abline(recta, col="red")
text(x=5, y=5.5, labels="recta de regresión", col="red")
La función mtext()
requiere indicaciones específicas de
zonas donde se desea agregar el texto. Por ejemplo, debemos indicar la
zona o side(1=bottom, 2=left, 3=top, 4=right)
donde
querémos agregar el texto.
plot(x,y, main="usando abline()", pch=16, col="blue")
# estimamos la recta de regresión lineal
recta <- lm(y~x)
abline(recta, col="red")
mtext(text = "texo abajo", side = 1, col="blue")
mtext(text = "texo izquierda", side = 2, col="blue")
mtext(text = "texo arriba", side = 3, col="blue")
mtext(text = "texo derecha", side = 4, col="blue")
Tambien es posible usar el argumento line
que indica el
margen de linea que se sitúa el texto en el side
especificado, por ejemplo:
plot(x,y, main="usando abline()", pch=16, col="blue")
# estimamos la recta de regresión lineal
recta <- lm(y~x)
abline(recta, col="red")
mtext(text = "texo arriba", side = 3, line = -2, col="blue")
mtext(text = "texo arriba", side = 3, line = -1, col="blue")
mtext(text = "texo arriba", side = 3, line = 0, col="blue")
mtext(text = "texo arriba", side = 3, line = 1, col="blue")
La función legend()
permite agregar leyendas que
muestran especificaciones de, por ejemplo, la representación de los
colores en los gráficos. Veamos el siguiente ejemplo:
boxplot(mp10~estacion, main="Niveles contaminantes en zona norte",
ylab="Material particulado 10um",
col=c("green", "yellow"), xaxt="n")
legend("topleft", inset=.02, title="Zona de monitoreo",
c("Piura", "Trujillo"), fill=c("green", "yellow"),
horiz=TRUE, cex=0.8)
Ahora otro ejemplo para gráficos de lineas:
# Generate some data
x<-1:10; y1=x*x; y2=2*y1
plot(x, y1, type="b", pch=19, col="red", xlab="x", ylab="y")
# Add a line
lines(x, y2, pch=18, col="blue", type="b", lty=2)
# Add a legend
legend(1, 95, legend=c("Line 1", "Line 2"),
col=c("red", "blue"), lty=1:2, cex=0.8)
La librería ggplot2
es una de las más utilizadas para
elaborar gráficos con una presentación mejorada y cuyo código facilita
elaboración de características agregadas al gráfico principal.
El esquema básico para hacer gráficos con ggplot es por medio de capas, las dos capas mínimas necesarias son las siguientes:
ggplot()+geom_point()
Al interior de ggplot()
se necesita especificar el
dataframe
y los aesthetics
, es decir, las
características necesarias para realizar el gráfico: variables,
coordenadas, colores, etc.
La capa geom_points()
es una de las diversas capas que
se puede utilizar en ggplot. En particular geom_points()
sirve para hacer gráficos de dispersión. Para el siguiente ejemplo se
hará uso de data(iris)
.
library(ggplot2)
data(iris)
ggplot(data = iris, aes(x= Petal.Length, y=Sepal.Width, color=Species)) +
geom_point()
Se puede usar la capa geom_histogram()
para generar un
histograma. Además, agregamos facet_wrap()
para separar los
gráficos según categorías:
# geometrics: geom_hist()
ggplot(data = iris, aes(x = Petal.Length, fill=Species))+
geom_histogram() +
facet_wrap(~ Species, ncol=1)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Para hacer gráficos de boxplot()
, usamos
geom_boxplot()
ggplot(data = iris, aes(x=Species, y=Petal.Length,fill=Species))+
geom_boxplot() +
ggtitle("Comparación de longitud por especie")
En todos los casos, observamos que ggplot agrega por defecto las
leyenda por colores, esto cada vez que especificamos en
aes()
la categorización por colores.
Para hacer gráficos de lineas usaremos geom_line()
:
x <- 1:20
y <- x ^ 2 + runif(20, 0, 100)
df <- data.frame(x = x, y = y)
ggplot(df, aes(x = x, y = y)) +
geom_line() +
geom_point()
En R existen diversas funciones para análisis estadístico descriptivo, dependiendo de si uno desea medidas de tendencia central, medidas de variabilidad, medidas de posición, etc.
Para el siguiente ejemplo seguiremos usando
data(iris)
:
# promedio
prom <- mean(iris$Sepal.Length)
prom
## [1] 5.843333
# desviación estandar
desv <- sd(iris$Sepal.Length)
desv
## [1] 0.8280661
# coeficiente de variación
CV <- (desv/prom)*100
CV
## [1] 14.17113
# mediana
median(iris$Sepal.Length)
## [1] 5.8
# cuartiles
quantile(x = iris$Sepal.Length,probs=c(0.25,0.50,0.75))
## 25% 50% 75%
## 5.1 5.8 6.4
# deciles
quantile(x = iris$Sepal.Length,probs=c(0.10,0.20,0.30,0.40))
## 10% 20% 30% 40%
## 4.80 5.00 5.27 5.60
Algunos de estos resultados se pueden obtener con la función
summary()
summary(iris$Sepal.Length)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.300 5.100 5.800 5.843 6.400 7.900
También se puede aplicar directamente a todo un conjunto de variables:
summary(iris[,1:4])
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Las funciones apply()
permite replicar la aplicación de
funciones o cálculos estadísticos según las condiciones o
características del dataframe
que estámos analizando. Por
ejemplo, puede ser de interés el calculo de estadísticas descritivas en
una variable del dataframe
pero condicionado a las
categorías de otra variable (cualitativa).
Las funciones apply()
, tienen las siguientes variantes:
apply(), lapply()
, sapply()
y t
apply()
.
La función apply()
contiene tres argumentos
necesarios:
X: matriz de datos.
MARGIN: 1 opera sobre filas, 2 opera sobre columnas.
FUN: función que se aplica según MARGIN.
Aplicaremos el ejemplo a data(iris):
apply(X = iris[1:4],MARGIN = 2,FUN = mean)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.843333 3.057333 3.758000 1.199333
La función lapply()
contiene tres argumentos
necesarios:
X: matriz de datos
MARGIN: 1 opera sobre filas, 2 opera sobre columnas
FUN: función que se aplica según MARGIN
La función lapply()
hace el cálculo similar a la función
apply()
pero los resultados que devuelve son en formato
lista:
lapply(X = iris[1:4],FUN = mean)
## $Sepal.Length
## [1] 5.843333
##
## $Sepal.Width
## [1] 3.057333
##
## $Petal.Length
## [1] 3.758
##
## $Petal.Width
## [1] 1.199333
La función sapply()
hace el cálculo similar a la función
apply()
pero los resultados son mostrados en formato
vector:
sapply(X = iris[1:4],FUN = mean)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.843333 3.057333 3.758000 1.199333
La función tapply()
hace el cálculo similar a la función
apply()
pero realiza los cálculo reagrupando los datos
según las categorías de otra variable cualitativa (variable INDEX):
tapply(X = iris$Sepal.Length,INDEX = iris$Species,FUN = mean)
## setosa versicolor virginica
## 5.006 5.936 6.588
A continuación se mostrará como realizar gráficos de mapas en R. Los archivos estan en el siguiente enlace: https://drive.google.com/drive/folders/1NDphXL-DbJAS3aI5VPu_WiQiEVCsCKNO?usp=sharing
library(rgdal)
mapa<-readOGR("DEPARTAMENTOS.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\LENOVO\Documents\LIBROS PARA EDITORIAL 2022\LIBRO LENGUAJE R\LibroR_v2\DEPARTAMENTOS.shp", layer: "DEPARTAMENTOS"
## with 25 features
## It has 4 fields
par(mar=c(2,2,2,2))
plot(mapa, axes=T)
Es posible realizar modificaicones de color, agregar puntos, por ejemplo, referente a los centroides de cada departamento como una forma de referencia.
La función coordinates()
extrae las coordenadas del mapa
y se almacena en el objeto coord_map
, luego separamos cada
eje de coordenadas en cordx
y cordy
.
# explorando datos del mapa
coord_map <- coordinates(mapa)
cordx <- coord_map[,1]
cordy <- coord_map[,2]
Luego podemos usar la función par()
para dividir el
espacio gráfico en dos segmentos, de esa forma podremos presentar dos
mapas con diferentes colores de presentación a fin de apreciar la
aplicación de la función plot()
y points()
en
capítulos anteriores. El argumento mar=c(2,2,2,2)
dentro de
par()
sirve para disminuir los márgenes del espacio gráfico
y así, poder aprovechar todo el espacio para graficar los mapas
# cambiando apariencia
par(mfrow=c(1,2), mar=c(2,2,2,2))
plot(mapa, col="gray80", border="white", axes=T) # export 890x460
points(x = cordx,y = cordy, pch=16, col="blue", cex=0.5)
plot(mapa, col="lightyellow", border="gray", axes=T) # export 890x460
points(x = cordx,y = cordy, pch=16, col="blue", cex=0.5)
Podemos usar todas las funciones gráficas de bajo nivel para modificar la apariencia del mapa:
# agregando etiquetas
par(mfrow=c(1,1), mar=c(2,2,2,2))
plot(mapa, col="gray80", border="white")
points(x = cordx,y = cordy, pch=16, col="blue", cex=0.5)
AcrDep1 <- c("Amazonas","Ancash","Apurimac","Arequipa",
"Ayacucho","Cajamarca","Callao","Cusco",
"Huancavelica","Huanuco","Ica","Junin",
"La Libertad","Lambayeque","Lima","Loreto",
"Madre de Dios","Moquegua","Pasco","Piura",
"Puno","San Martin","Tacna","Tumbes","Ucayali")
text(coord_map,labels = AcrDep1,cex = 0.7)
title("Mapa del Perú",line = 0.8)
mtext("(Departamentos)",side = 3,line = -0.5, cex = 0.8)
Finalmente veremos cómo hacer un mapa de calor, que permite ver según diferentes niveles de intensidad de color la incidencia de los casos de infección por COVID-19 a nivel de departamentos de Perú.
## colores nivel COVID19
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.1
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✔ tibble 3.1.7 ✔ dplyr 1.0.9
## ✔ tidyr 1.2.0 ✔ stringr 1.4.0
## ✔ readr 2.1.2 ✔ forcats 0.5.1
## ✔ purrr 0.3.4
## Warning: package 'dplyr' was built under R version 4.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(RColorBrewer)
library(classInt)
dat_covid <- read.table("covid.txt", header = T, sep = "\t")
mapa_covid <- dat_covid %>%
left_join(mapa@data, by = c("DEPARTAMEN"="DEPARTAMEN"))
colores <- brewer.pal(7,"PuRd")
class <- classIntervals(var = mapa_covid$COVID[-15],
n = 7,style = "equal")
colcode <- findColours(class,colores)
par(mar=c(2,2,2,2))
plot(mapa, col=colcode, axes=T) # export 890x460
plot(mapa[15,], col="#91003F", add=T) # export 890x460
legend("bottomleft", legend = names(attr(colcode, "table")),
fill = attr(colcode,"palette"), cex = 0.8)
title(main = "Impacto del covid19 en Perú")