Uno de los aspectos mas poderosos de R es su capacidad de producir una gran variedad de gráficos los cuales pueden ser reproducibles, modificables y publicables con solo unos poco comandos.
R puede producir gráficos utilizando tres paquetes principales: ggplot, lattice y gráficos base. En esta sección nos enfocaremos a los gráficos base.
Para este ejercicio utilizaremos datos de mediciones en distintas estaciones de muestreo:
mediciones <- read.csv("data/Tabla_Colecta_estaciones.csv", h = T)
str(mediciones)
## 'data.frame': 144 obs. of 8 variables:
## $ Individuo : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Sitio : Factor w/ 3 levels "Asuncion","Bahia La Paz",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ Estacion : Factor w/ 2 levels "Invierno","Verano": 2 2 2 2 2 2 2 2 2 2 ...
## $ Sexo : Factor w/ 2 levels "H","M": 1 2 1 1 2 1 1 2 1 2 ...
## $ Profundidad : Factor w/ 2 levels "Fondo","Superficie": 2 2 2 2 2 2 2 2 2 2 ...
## $ Longitud_total : num 30.3 35.5 30.4 24.9 31.8 ...
## $ Longitud_parcial: num 22.4 26.3 22.5 18.4 23.6 ...
## $ anchura : num 11.21 13.14 11.24 9.21 11.78 ...
Vemos que la tabla contiene 8 variables, de las cuales, tres constituyen valores numericos (longitud total, longitud parcial y anchura)
hist()Para crear un histograma usamos la función hist(), que siempre nos pide como argumento x un vector numérico. El resto de los argumentos de esta función son opcionales. Si damos un vector no numérico, se nos devolverá un error.
Para obtener un hitograma de frecuencias de la longitud total se ejecuta el siguiente comando:
hist(x = mediciones$Longitud_total)
Para la longitud parcial:
hist(x = mediciones$Longitud_parcial)
Vamos a cambiar el título del gráfico con el argumento main, y el nombre de los ejes x y Y con xlab y ylab, respectivamente.
hist(x = mediciones$Longitud_total,
main = "histograma de longitud total (mm)",
xlab = "longitud (mm)",
ylab = "Frecuencia")
La funcion hist auntomaticamente selecciona el número de intervales (“breaks”) mas adecuado. Pero es posible definirlos manualmente con el parametro “breaks”
hist(x = mediciones$Longitud_total,
breaks = 15)
hist(x = mediciones$Longitud_total,
breaks = 30)
Probemos cambiando el color de las barras del histograma agregando el argumento col. Este argumento acepta nombres de colores genéricos en inglés como “red”, “blue” o “purple”; y también acepta colores hexadecimales, como “#00FFFF”, “#08001a” o “#1c48b5”.
hist(x = mediciones$Longitud_total,
main = "histograma de longitud total (mm)",
xlab = "longitud (mm)",
ylab = "Frecuencia",
col = "purple")
plot()Esta función tiene un comportamiento especial, pues dependiendo del tipo de dato que le demos como argumento, generará diferentes tipos de gráfica. Además, para cada tipo de gráfico, podremos ajustar diferentes parámetros que controlan su aspecto, dentro de esta misma función.
Dependiendo del tipo de dato que demos a x y y será el gráfico que obtendremos, de acuerdo a las siguientes reglas:
| x | y | Gráfico |
|---|---|---|
| Continuo | Continuo | Diagrama de dispersión (Scatterplot) |
| Continuo | Discreto | Diagrama de dispersión, y coercionada a numérica |
| Continuo | Ninguno | Diagrama de dispersión, por número de renglón |
| Discreto | Continuo | Diagrama de caja (Box plot) |
| Discreto | Discreto | Gráfico de mosaico (Diagrama de Kinneman) |
| Discreto | Ninguno | Gráfica de barras |
| Ninguno | Cualquiera | Error |
por ejemplo, si graficamos solamente la longitud parcial (continuo + Ninguno):
plot(mediciones$Longitud_parcial)
pero si graficamos longitud total x anchura (continuo + continuo)
plot(mediciones$Longitud_parcial, mediciones$anchura)
ahora si graficamos Longitud total x Sitio (continuo x discreto)
plot(mediciones$Longitud_total, mediciones$Sitio)
si graficamos Sexo (discreto x niunguno)
plot(mediciones$Sexo)
Ahora si graficamos sexo x profundida (discreto x discreto)
plot(mediciones$Sexo, mediciones$Profundidad)
ahora si graficamos estación y longitud total (discreto x continuo)
plot(mediciones$Estacion, mediciones$Longitud_total)
La función plot es particularmente util para graficar series de tiempo. Para visualizar esto, vamos a generar un vector con una serie de 31 años, desde 1990 hasta el 2020 usando la función seq() y rnorm()
year <- seq(1990,2020,1)
value <- rnorm(31)
plot(year, value)
Para controlar el tipo de grafico dentre de esta función, usamos el parametro `type" donde puede ser:
plot(year, value, type = "l")
plot(year, value, type ="b")
Al igual que con hist() es posible cambiar el color de una grafica, asi como los nombres usando los parametros main, col y xlab, ylab
plot(year, value, type="l", col ="red", main = "gráfico anual", xlab = "Año", ylab = "anomalia")
boxplot()Los diagrams de caja, o boxplots, son gráficos que muestra la distribución de una variable usando cuartiles, de modo que de manera visual podemos inferir algunas cosas sobre su dispersión, ubicación y simetría.
Una gráfica de este tipo dibuja un rectángulo cruzado por una línea recta horizontal. Esta linea recta representa la mediana, el segundo cuartil, su base representa el pimer cuartil y su parte superior el tercer cuartil. Al rango entre el primer y tercer cuartil se le conoce como intercuartílico.
EN la sección anterior vimos como generar un boxplot usando la funcion plot(). Una alternativa es utilizar la función boxplot().
En la segunda manera necesitamos dar dos argumentos:
Por ejemplo, para generar diagramas de la longitud total por sitio de colecta, se ejecuta el comando:
boxplot(Longitud_total ~ Sitio, data = mediciones)
Esta opción nos permite generar graficos con interacción. Por ejemplo, si quieremos graficar la longitud total en función del sitio de colecta y del sexo, ejecutamos:
boxplot(Longitud_total ~ Sexo * Sitio, data = mediciones)
Para facilitar la lectura de la gráfica, se le puede asignar un color difente a cada grupo
boxplot(Longitud_total ~ Sexo * Sitio, data = mediciones, col = c("tomato", "lightblue"))
Asignar un color de acuerdo a una variabl
plot(mediciones$Longitud_parcial, mediciones$anchura, col = mediciones$Sitio)
Cambiar el tamaño del simbolo o forma del simbolo:
plot(mediciones$Longitud_parcial, mediciones$anchura, col = mediciones$Sitio, pch = 16, cex = 2)
En donde pch() indica el simbolo, mientras que cex()el tamaño.
Aqui encontraras una lista con los valores de cada simbolo:
Para los simbolos de 21 a 25, es necesario especificar el color del borde (col=) asi como del relleno (bg=)
CUando usamos plot() es posible unir dos series diferentes. Para esto, primero se gráfica la primera serie, que en este caso es “value” y posteriormente se añada la segunda serie usando la funciones lines(). Por ejemplo, generamos un segundo vector con 31 datos:
value2 <- rnorm(31)
Ahora podemos unir ambos vectores en la misma gráfica de la siguiente forma:
plot(year, value, type = "l", col ="tomato", lwd=2, ylim = c(-5,5))
lines(year, value2, col = "lightblue", lwd = 2, lty= "dashed")
Entre los parametros que se pueden modificar tenemos:
lwd = grosor de la linealty = tipo de linea (“dashed”, “solid”, “dotted” y “longdash”)ylim = limites del eje Y. Este es en forma de vector numericoPara añadir una leyenda, se usa la función legend() despues del gráfico.
plot(year, value, type = "l", col ="tomato", lwd=2, ylim = c(-5,5))
lines(year, value2, col = "lightblue", lwd = 2, lty= "dashed")
legend("topleft", legend = c("value1", "value2"),
col=c("tomato", "lightblue"),
lty = c("solid", "dashed"))
Para unir dos o mas gráficos es posible ajustar el área de gráfico con la funcion par()
par(mfrow=c(1,2)) #numero de filas, numero de columnas
plot(year, value, type = "l", col ="tomato", lwd=2, ylim = c(-5,5))
plot(year, value2, type = "l", col ="lightblue", lwd=2, ylim = c(-5,5))
dev.off() #limpia el area de gráfico
## null device
## 1
par(mfrow=c(2,1)) #numero de filas, numero de columnas
plot(year, value, type = "l", col ="tomato", lwd=2, ylim = c(-5,5))
plot(year, value2, type = "l", col ="lightblue", lwd=2, ylim = c(-5,5))
dev.off()
## null device
## 1
Finalmente, es posible usar la función mtext() para agregar titulo a una serie de gráficas.
par(mfrow=c(1,3), oma = c(0, 0, 2, 0)) #numero de filas, numero de columnas
plot(mediciones$Longitud_parcial, mediciones$anchura, type = "p", main = "relación longitud parcial y anchura")
boxplot(Longitud_total ~ Sitio, data = mediciones, main = "Longitud total por sitio")
hist(mediciones$Longitud_parcial, main="Histograma Logitud parcial")
mtext("Datos de Longitud total por muestreo", outer = TRUE)
dev.off() #limpia el area de gráfico
## null device
## 1
Observa que para que se despliegue el texto en la parte superior, es necesario ajustar el espacio del gráfico, es decir, incrementar el margen
Los margenes de una figura se ajustan con los parametros mar(), para los margenes internos, y omar()para los margenes externos, tal como se muestra en la siguiente figura:
Para ambos parametros, se asignan cuatro valores para indicar el espacio abajo, izquierda, arriba, derecha.
Ejercicio: Usando todos tus conocimientos adquiridos hasta este punto, recrea esta gráfica:
## null device
## 1