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)

1: Histograma 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")

2:Función 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:

  • “l” = linea
  • “o” = puntos
  • “b” = ambos
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")

3:Boxplots 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:

  • formula: Para esta función las fórmulas tienen el formato y ~ x, donde x es el nombre de la variable continua a graficar, y la x es la variable que usaremos como agrupación.
  • data: Es el data frame del que serántomadas las variable

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"))

4:Edición

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 linea
  • lty = tipo de linea (“dashed”, “solid”, “dotted” y “longdash”)
  • ylim = limites del eje Y. Este es en forma de vector numerico

Para 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:

Ejercicio: Usando todos tus conocimientos adquiridos hasta este punto, recrea esta gráfica:

## null device 
##           1