Tydiverse-ggplot2

Manuel Barrios

2022-04-01

Introducción

ggplot2 es una de las herramientas de tydiverse que se utiliza para la creación de gráficos de alta calidad para publicación. El lenguaje de ggplot2 está basado en The Grammar of Graphics. ggplot2 incluye varias funciones para seleccionar las variables a graficar y el tipo de gráfica a realizar.

#install.packages(c("ggplot2", "dplyr", "Lock5Data"))

library(ggplot2) # Crear gráficos de alta calidad
library(dplyr) # Manipulación de datos
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(Lock5Data) #Bases de datos

##Gráficos de cajas y bigotes

Vamos a leer y explorar los datos del dataframe Young Blood que viene con Lock5Data. Este dataframe proviene de un estudio en donde se realizó una transfusión de plasma de ratones jovenes a ratones ancianos, para evaluar si es posible revertir el envejecimiento cerebral.

Los datos provienen de las siguientes referencias sciencenews.org y Science.

data("YoungBlood")
class(YoungBlood)
## [1] "tbl_df"     "tbl"        "data.frame"
str(YoungBlood)
## tibble [30 x 2] (S3: tbl_df/tbl/data.frame)
##  $ Plasma : chr [1:30] "Old" "Old" "Old" "Old" ...
##  $ Runtime: int [1:30] 19 21 22 25 28 29 29 31 36 42 ...
##  - attr(*, "spec")=List of 2
##   ..$ cols   :List of 2
##   .. ..$ Plasma : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ Runtime: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_integer" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..- attr(*, "class")= chr "col_spec"
dim(YoungBlood)
## [1] 30  2
names(YoungBlood)
## [1] "Plasma"  "Runtime"
head(YoungBlood)
## # A tibble: 6 x 2
##   Plasma Runtime
##   <chr>    <int>
## 1 Old         19
## 2 Old         21
## 3 Old         22
## 4 Old         25
## 5 Old         28
## 6 Old         29
Plasma<-as.factor(YoungBlood$Plasma)
Runtime<-YoungBlood$Runtime
Plasma;Runtime
##  [1] Old   Old   Old   Old   Old   Old   Old   Old   Old   Old   Old   Old  
## [13] Old   Young Young Young Young Young Young Young Young Young Young Young
## [25] Young Young Young Young Young Young
## Levels: Old Young
##  [1] 19 21 22 25 28 29 29 31 36 42 50 51 68 27 28 31 35 39 40 45 46 55 56 59 68
## [26] 76 90 90 90 90
plot(Runtime~Plasma) #un plot normal sin arreglos estéticos

Ahora vamos a crear el mismo gráfico con ggplot2. La estructura de ggplot2 es la siguiente:

ggplot(data= , mapping= aes(x= , y= )) + geom()

En data vamos a ingresar el objeto en el cual se encuentra guardado el dataframe y en aes vamos a ingresar las varibles a graficar y les vamos a asignar un eje, además de características como color, tamaño y forma.

En geom() vamos a indicar el tipo de gráfico, por ejemplo:

Si quieres explorar más acerca de los tipos de gráficos de ggplot puedes consultar el siguiente enlace

Ahora construiremos el gráfico de cajas y bigotes con las variables Runtime y Plasma

ggplot(data=YoungBlood, aes(x=Plasma, y=Runtime)) +
  geom_boxplot()

Si lo queremos graficar en posición horizontal invertimos la posición de los ejes.

ggplot(data=YoungBlood, aes(y=Plasma, x=Runtime)) +
  geom_boxplot()

Si queremos graficar con muescas utilizamos notch = T.

ggplot(data=YoungBlood, aes(x=Plasma, y=Runtime)) +
  geom_boxplot(notch=T)
## notch went outside hinges. Try setting notch=FALSE.

Si queremos asignar colores podemos utilizar una paleta de colores o utilizar un código de colores HEX.

ggplot(data=YoungBlood, aes(x=Plasma, y=Runtime)) +
  geom_boxplot(fill="brown4", colour= "#000000")

También podemos asignar forma y color a los outliers.

ggplot(data=YoungBlood, aes(x=Plasma, y=Runtime)) +
  geom_boxplot(fill="brown4", colour= "#000000", outlier.colour = "red", outlier.shape = 1)

Podemos colocar los valores de los datos de forma dispersa sobre el gráfico.

ggplot(data=YoungBlood, aes(x=Plasma, y=Runtime)) +
  geom_boxplot(fill="brown4", colour= "#000000", outlier.colour = "red", outlier.shape = 1) + 
  geom_jitter(width = 0.2)

Podemos cambiar de un gráfico de cajas y bigotes a un gráfico de violin

ggplot(data=YoungBlood, aes(x=Plasma, y=Runtime)) +
  geom_violin(fill="brown4", colour= "#000000", outlier.colour = "red",
              outlier.shape = 1) +
  geom_jitter(width = 0.2)
## Warning: Ignoring unknown parameters: outlier.colour, outlier.shape

Ahora vamos a explorar la base de datos iris, que contiene datos de mediciones florales de especies del género Iris (Iridiace).

data("iris")
class(iris)
## [1] "data.frame"
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
dim(iris)
## [1] 150   5
names(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

Ahora vamos a crear algunas columnas adicionales y posteriormente realizaremo algunos graficos.

iris<-iris %>% 
  mutate(Slen=Sepal.Length*Sepal.Width, Plen=Petal.Length*Petal.Width) %>%
  mutate(
      Slen.m= case_when(
        Slen <15 ~ "Pequeño",
        Slen >=15 & Slen <=20 ~ "Mediano", 
        Slen >20 ~ "Grande",
        TRUE ~ "otro"
        )
  )
names(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
## [6] "Slen"         "Plen"         "Slen.m"
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species  Slen Plen  Slen.m
## 1          5.1         3.5          1.4         0.2  setosa 17.85 0.28 Mediano
## 2          4.9         3.0          1.4         0.2  setosa 14.70 0.28 Pequeño
## 3          4.7         3.2          1.3         0.2  setosa 15.04 0.26 Mediano
## 4          4.6         3.1          1.5         0.2  setosa 14.26 0.30 Pequeño
## 5          5.0         3.6          1.4         0.2  setosa 18.00 0.28 Mediano
## 6          5.4         3.9          1.7         0.4  setosa 21.06 0.68  Grande
ggplot(iris, aes(Species, y=Sepal.Length)) +
  geom_boxplot(aes(colour=Slen.m),outlier.colour = "red", 
               outlier.shape = 1)

ggplot(iris, aes(Slen.m, y=Sepal.Length)) +
  geom_boxplot(aes(colour=Species),outlier.colour = "red", 
               outlier.shape = 1)+
  xlab("Tamaño de los sépalos") + ylab("Longitud de los sépalos (mm)")

ggplot(iris, aes(Slen.m, y=Sepal.Length)) +
  geom_violin(aes(colour=Species))+
  xlab("Tamaño de los sépalos") + ylab("Longitud de los sépalos (mm)")

Gráficos de dispersión

Vamos a revisar cómo se correlaciona la longitud de los sépalos vs la longitud de los pétalos.

ggplot(data = iris, mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
       geom_point()

Separemos las especies por color

ggplot(data = iris, mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
       geom_point(aes(colour=Species) )

Cambiemos la forma de los marcadores

ggplot(data = iris, mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
       geom_point(aes(colour=Species), shape=2 )

Ahora exploremos la base de datos de Breakfast Cereals

data("Cereal")
dim(Cereal)
## [1] 30 10
head(Cereal)
##                    Name Company Serving Calories Fat Sodium Carbs Fiber Sugars
## 1            AppleJacks       K    1.00      117 0.6    143    27   0.5   15.0
## 2             Boo Berry       G    1.00      118 0.8    211    27   0.1   14.0
## 3          Cap'n Crunch       Q    0.75      144 2.1    269    31   1.1   16.0
## 4 Cinnamon Toast Crunch       G    0.75      169 4.4    408    32   1.7   13.3
## 5          Cocoa Blasts       Q    1.00      130 1.2    135    29   0.8   16.0
## 6           Cocoa Puffs       G    1.00      117 1.0    171    26   0.8   14.0
##   Protein
## 1     1.0
## 2     1.0
## 3     1.3
## 4     2.7
## 5     1.0
## 6     1.0
ggplot(Cereal, aes(Sugars,Calories, )) + 
       geom_point(aes(colour=Company))

Faceting

ggplot(Cereal, aes(Calories, Sugars)) + 
  geom_point() +
  facet_grid(.~ Company)

Cambiar la posición

ggplot(Cereal, aes(Calories, Sugars)) + 
  geom_point() +
  facet_grid(Company ~.)

Agregar una línea de regresión

ggplot(Cereal, aes(Calories, Sugars)) + 
  geom_point() +
  facet_grid(.~ Company)+
  geom_smooth(method=lm)
## `geom_smooth()` using formula 'y ~ x'

Histogramas

ggplot(data = Cereal, mapping = aes(Sugars)) + 
  geom_histogram() 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = Cereal, mapping = aes(Sugars)) + 
  geom_histogram(bins=6) 

Es posible cambiar en el eje “y” de conteo a densidad.

ggplot(data = Cereal, mapping = aes(x=Sugars, y= ..density..)) + 
  geom_histogram(bins=6) 

Con geom_bar podemos realizar conteos de variables categóricas y expresarlos en gráficos de barras.

ggplot(data = Cereal, mapping = aes(x=Company)) + 
  geom_bar() 

Si utilizamos geom_line podemos agregar una linea de tendencia, con el comando alpha podemos darle transparencia a los gráficos. Con el comando breaks podemos indicar el inicio y final del eje x y además indicar el grosor de los bins

ggplot(Cereal, aes(Sugars)) +
  geom_histogram(aes(y= ..density..), fill = "brown4", alpha = 0.5,
                 breaks=seq(0,22.5,2.5))+
  geom_line(aes(y = ..density..), colour=1, stat = 'density', 
            size = 2, alpha = .6)

Tarea 3. Proyectos y Tydiverse

Para la presente tarea se utilizaran bases de datos reales a las que tengan acceso los maestrandos, puede ser la base de datos de su tesis de licenciatura.

3.1 Proyectos: cree una carpeta dentro de su computadora y dentro de esta carpeta cree subcarpetas para ordenar su ambiente de trabajo.

3.2 La base de datos a utilizar deberá estar en formato de texto separado por comas CSV. Realice lo siguiente:

3.2.1 Cargue la base de datos al ambiente de trabajo. 3.2.2 Explore los datos utilizando los comandos str, names, head, View, type.of, class. 3.2.3 Indique que tipos de datos tiene en cada columna: caracter, enteros, números. 3.2.4 Ponga en práctica los conocimientos adquiridos con dplyr, utilizando los comandos filter, mutate, select, summarize, group_by, etc. y guarde los subsets en nuevos objetos. 3.2.5 Elabore gr[aficos para análisis exploratorios utilizando los comandos de ggplot, procuré ser muy creativo para obtener gráficos de alta calidad.

Nota: Para cada uno de los incisos deberán de colocar los comandos utilizados y realizar una captura de pantalla de la consola o de las imágenes según sea el caso