1: Tidyverse

Hasta ahora hemos visto dos paquetes, dplyr y tidyr las cuales son muy similares en su uso y permiten integrar diversas funciones en el mismo flujo de trabajo.

Esta filosofía impusó el desarrollo de Tidyverse, el cual es un conjunto de paquetes que interactuan entre ellos permitiendo un flujo de trabajo eficiente.

Para usar Tidyverse, simplemente installa el paquete y al cargar la libreria, se cargaran todos los paquetes necesarios, entre ellos:

  • dplyr
  • tidyr
  • ggplot2
  • readr*

*Reader permite abrir datos de manera analoga a read.table() o read.csv() pero abre los datos directamente como tibbles. La forma de usarlos es:

  • read_table()
  • read_csv()
  • read_delim()

fuera de eso, la sintaxis es igual al de las funciones base de R.

Nota: El paquete readxl no forma parte formalmente de tidyverse, pero se une al flujo de trabajo.

2: ¿Que es ggplot?

ggplot2 es un paquete, parte de Tidyverse para crear gráficos estáticos. Se basa en el principio de Grammar of graphics de Leland Wilkinson (1999) en el cual, los gráficos se deconstruyen en cada uno de sus componentes:

  • Data: ggplot espera como entrada un conjunto de datos limpio (tidy). Podemos usar un conjunto de datos distintos para capas distintas.
  • Aesthetics: La escala en al cual se ubicaran los datos.
  • Geometries: Elemento gráfico al que se van a mapear las variables del conjunto de datos. Pueden ser lineas, puntos, bowplots, etc.
  • Facets: Filas y columnas de sub gráficos.
  • statistics: Modelos y resumenes estaditicos.
  • Coordinates: Por defecto, ggplot aplicará las coordenadas cartesianas al gráfico, pero podemos modificar las escalas, asi como el sistema de coordenadas.
  • Theme: Funciones y argumentos relacionados con aspectos gráficos.

3: Funcionamiento básico

Para poder utilizar ggplot2, podemos cargar solamente la libreria ggplot2 o cargar todo el conjunto de paquetes tidyverse el cual incluye herramientas que hemos usado hasta ahora como dplyr, tidyr, readr, tibble y ggplot2.

Para esta parte, usaremos la misma base de datos Tabla_Colecta_estaciones.csv

library(tidyverse)
## Warning: package 'ggplot2' was built under R version 3.6.3
## Warning: package 'tibble' was built under R version 3.6.3
## Warning: package 'purrr' was built under R version 3.6.3
## Warning: package 'dplyr' was built under R version 3.6.3
mediciones <- read_csv("data/Tabla_Colecta_estaciones.csv")
mediciones
## # A tibble: 144 x 8
##    Individuo Sitio Estacion Sexo  Profundidad Longitud_total Longitud_parcial
##        <dbl> <chr> <chr>    <chr> <chr>                <dbl>            <dbl>
##  1         1 Bahi~ Verano   H     Superficie            30.3             22.4
##  2         2 Bahi~ Verano   M     Superficie            35.5             26.3
##  3         3 Bahi~ Verano   H     Superficie            30.4             22.5
##  4         4 Bahi~ Verano   H     Superficie            24.9             18.4
##  5         5 Bahi~ Verano   M     Superficie            31.8             23.6
##  6         6 Bahi~ Verano   H     Superficie            29.5             21.9
##  7         7 Bahi~ Verano   H     Superficie            26.6             19.7
##  8         8 Bahi~ Verano   M     Superficie            26.2             19.4
##  9         9 Bahi~ Verano   H     Superficie            29.4             21.7
## 10        10 Bahi~ Verano   M     Superficie            34.4             25.4
## # ... with 134 more rows, and 1 more variable: anchura <dbl>

Función ggplot()

ggplot(data = mediciones)

Esta funcion no da error, pero no vemos ninguna gráfica. Esto se debe a que no hemos indicado a ggplot que es lo que tiene que hacer con los datos.

ggplot(data = mediciones, aes(x = Sitio, y = Longitud_total))

Lo primero que debes hacer es decirle a la función ggplot qué conjunto de datos (o dataset) debe utilizar. Esto se hace escribiendo ggplot(df), donde df es un dataframe que contiene todas las características necesarias para hacer la trama. A diferencia de los gráficos de base, ggplot no toma los vectores como argumentos. Este es el primer paso.

El argumento aes() es sinónimo de estética, ggplot2 considera que el eje X e Y de la gráfica es estético, junto con el color, el tamaño, la forma, el relleno, etc. Se puede agregar cualquier estética que se desee dentro del argumento aes(), como por ejemplo indicar los ejes X e Y, especificando las variables respectivas del conjunto de datos. La variable en función de la cual el color, tamaño, forma y trazo debe cambiar también se puede especificar aquí mismo. Debes tener en cuenta que la estética especificada aquí será heredada por todas las capas geom que se agregarán posteriormente

En este caso, además de indicar el conjunto de datos con el que vamos a trabajar dentro de la función Aesthetics (aes()), mapeamos las variables sitio y Longitud_total (posicionados en los ejes x y y respectivamente).

Sin embargo, aún no vemos ninguna gráfica, ya que para esto es necesario indicar que tipo de geometria (geom()) de gráfica queremos utilizar.

ggplot(data = mediciones, aes(x = Sitio, y = Longitud_total))+
  geom_point()

Observa que una vez que definimos el aesthetics, podemos cambiar la geometria para dibujar distintos tipos de gráfico, como por ejemplo un box plot

ggplot(data = mediciones, aes(x = Sitio, y = Longitud_total))+
  geom_boxplot()

o graficos de disperción usando longitud parcial en x y longitud total en y.

ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total))+
  geom_point()

Mutiples gráficas con facet_grid()

Con facet_grid()podemos incluir disintos planos para cada grupo de nueestra base de datos

ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total))+
  geom_point()+
  facet_grid(.~ Sitio)

con interaccion

ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total))+
  geom_point()+
  facet_grid(Profundidad~ Sitio)

Es posible incluir funciones estadisticas

ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total))+
  geom_point()+
  facet_grid(Profundidad~ Sitio) +
  stat_smooth(method = "lm", se = F, col ="red")
## `geom_smooth()` using formula 'y ~ x'

Ajustar limites

ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total))+
  geom_point()+
  facet_grid(Profundidad~ Sitio) +
  stat_smooth(method = "lm", se = F, col ="red")+
  scale_y_continuous("Longitud total (mm)",
                     limits = c(0,100))+
   scale_x_continuous("Longitud Parcial (mm)", limits = c(0,100))
## `geom_smooth()` using formula 'y ~ x'

Titulos

Para cambiar los nombres de los ejes, asi como el titulo de la gráfica, se puede utilizar las funciones:

  • xlab()
  • ylab
  • ggtitle()
ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total)) +
  geom_point()+
  xlab("Longitud parcial (mm)") + 
  ylab("Longitud total (mm)") +
  ggtitle("relacion de longitud total y parcial")

o simplemente utilizando la funcion labs()

ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total)) +
  geom_point()+
labs(x = "Longitud parcial (mm)", 
       y = "Longitud total (mm)", 
       title = "relacion de longitud total y parcial")

Temas

Finalmente usamos themes para controlar parametros gráficos independientes de los datos, tales como color de fondo, tamaño y tipo de letra, margenes, leyenda, etc.

Los parametros que se pueden controlar con themes()son abundantes, sin embargo, existen varios themes en ggplot2 que se pueden usar rapidamente para cambiar el formato:

  • theme_gray()
  • theme_bw()
  • theme_linedraw()
  • theme_light()
  • theme_minimal()
  • theme_classic()
ggplot(data = mediciones, aes(x = Longitud_parcial, y = Longitud_total))+
  geom_point()+
  facet_grid(Profundidad~ Sitio) +
  stat_smooth(method = "lm", se = F, col ="red")+
  scale_y_continuous("Longitud total (mm)",
                     limits = c(0,100))+
  scale_x_continuous("Longitud Parcial (mm)", limits = c(0,100))+
  theme_minimal()
## `geom_smooth()` using formula 'y ~ x'

4: Ventajas de ggplot sobre base graphics

Una de las ventajas de ggplot, es que podemos asignar una gráfica como objeto y hace cambios subsiguientes. Por ejemplo:

p <- ggplot(mediciones, aes(x = Longitud_parcial, y = Longitud_parcial)) +
  geom_point()

p

Para posteriormente editar el grafico

p + facet_grid(.~Sexo)

p + facet_grid(.~Sexo) + theme_classic()

5: Definir groupos con Aesthetics

Con la función aes() no solo definimos el plano sino que se pueden definir colores o escalas para cada grupo:

ggplot(mediciones, aes(x = Longitud_total, y = Longitud_parcial, col = Profundidad)) +
  geom_line()

Ahora apliquemos diferentes aesthetics para diferenciar sitios y profundidad entre la longitud total y la longitud parcial con geom_point().

ggplot(mediciones, aes(x = Longitud_total, y = Longitud_parcial, col = Sitio, shape = Profundidad)) +
  geom_point()

Tambien es posible asignarle diferentes atributos a cada variable con aesthetics y usar facet_grid()

k <- ggplot(mediciones, aes(x = Longitud_total, y = Longitud_parcial, col = Sitio, shape = Profundidad)) 
k +  geom_point()

k  + geom_point() + facet_grid(Sitio~ Profundidad)

El control de Aesthetis tambien funciona con otros tipos de graficos, como Boxplots:

k <- ggplot(mediciones, aes(x = Sitio, y = Longitud_parcial, col = Sitio))

k + geom_boxplot()

O histogramas

k <- ggplot(mediciones, aes(x = Longitud_parcial, fill = Sitio))

k + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

6: Ejercicio COVID

Ejercicio: Dentro de la carpeta data encontraras el archivo covid_cumulative_since100.csv. Este contiene el número de casos acumulados a partir del caso No 100 (cu_cases) por país hasta el dia 23/05/2020. Utilizando dplyr y ggplot, haz lo siguiente:

  • Filtra los paises China, México, EUA y Francia (iso3 = CHN, MEX, USA y FRA)
  • convierte las fechas de caracteres a fecha con la funcion as.Date(date,"%m/%d/%Y")
  • Haz una gráfica de lineas con ggplot2 con los paises filtrados con date en el eje x y cu_cases en el eje y tal como se muestra en la imagen:

Respuesta:

## Parsed with column specification:
## cols(
##   date = col_character(),
##   cname = col_character(),
##   iso3 = col_character(),
##   cases = col_double(),
##   deaths = col_double(),
##   cu_cases = col_double(),
##   cu_deaths = col_double(),
##   days_elapsed = col_double()
## )