library(knitr)
opts_chunk$set(tidy.opts=list(width.cutoff = 50), tidy=TRUE, message=FALSE, warning=FALSE)

# devtools::install_github("hadley/emo")

library(emo)

El paquete ggplot2 fue desarrollado por Hadley Wickham basado en los principios de la “gramática de gráficos” de Leland Wilkinson. Según la “gramática de los gráficos”, cada gráfico se puede creer a partir de los siguientes componentes:

  1. Un juego de datos
  2. Un conjunto de “geoms” (objetos geométricos: marcas visuales que representan puntos de datos
  3. Un sistema de coordenadas (Visualización de datos con ggplot2 Cheat Sheet)

Para la mayoría de las aplicaciones, el código para producir un gráfico en ggplot2 está estructurado de la siguiente manera:

ggplot(data = , aes(x = , y = , color = , linetype = )) +

geom() +

[otros parámetros gráficos, ejmp: colores, titulo, fondo, lineas]

 

El cual se puede representar esquemáticamente así:

esquema ggplot2

 

Nótese que los diferentes componentes se organizan como capas que son sobrepuestas usando el operador ‘+’ (aunque en este caso no implica un cálculo aritmético)

Se pueden asignar variables de los datos a otros componentes, como el color o tamaño:

esquema ggplot2

 

  • ggplot(): función para iniciar un gráfico en ggplot2
    • data: especifica el marco de datos a partir del cual se produce el gráfico
    • aes(): especifica asignaciones estéticas que describen cómo se asignan las variables a las propiedades visuales del gráfico. El valor mínimo que debe especificarse (para la visualización de datos univariantes) es el parámetro x, dondex especifica la variable que se trazará en el eje x. De manera análoga, el parámetro y especifica la variable que se trazará en el eje y. Otros parámetros como color tambien pueden ser asignados a una variable.
  • geom_X(): Especifica el tipo de gráfico a utilizar. Hay muchas “geoms” diferentes (X debe ser remplazado con el tipo específico. Algunos de los más comunes incluyen geom_point() para diagramas de dispersión, geom_line() para gráficos de líneas, geom_boxplot() para boxplots, geom_bar() para diagramas de barras para datos discretos y geom_histogram() para datos continuos.

Para obtener una descripción general de las funciones y “geoms” más importantes disponibles a través de ggplot2, consulte la hoja resumen deggplot2 (https://nyu-cdsc.github.io/learningr/assets/data-visualization-2.1.pdf).

Visualizaciones univariadas

Histogramas

Los histogramas grafican la distribución de variables continuas. En este primer ejemplo, graficamos la distribución de la variable len (largo) de el juego de datos de ejemplo ToothGrowth. Podemos correr primero la función ggplot() sin ningun “geom” para mostrar la primera “capa” del gráfico:

library(ggplot2)

data("ToothGrowth")

ggplot(data = ToothGrowth, mapping = aes(len))

Ahora podemos añadir el geom_histogram():

ggplot(data = ToothGrowth, mapping = aes(len)) + geom_histogram()

Normalmente corremos ambas capas al mismo tiempo. Aquí se han dividido para hacer mas claro la contribución de cada una de las capas. También podemos añadir capas a un gráfico previamente guardado como un objeto:

# guardar grafico
gg_hist <- ggplot(data = ToothGrowth, mapping = aes(len))

# sumar nueva capa
gg_hist + geom_histogram()

Podemos cambiar otros componentes del gráfico como el color de relleno (fill) o el número de barras (bins):

ggplot(data = ToothGrowth, mapping = aes(len)) + geom_histogram(bins = 60, 
    fill = "orange")

Gráfico de densidad

Los gráficos de densidad son alternativas continuas a los histogramas que no dependen de los “bins”. Podemos interpretar la altura de la curva de densidad de una manera similar a como interpretamos la altura de las barras en un histograma: cuanto más alta es la curva, más observaciones tenemos en ese valor específico de la variable de interés. En este primer ejemplo, usamos la función geom_density() para crear la gráfica de densidad:

ggplot(data = ToothGrowth, mapping = aes(len)) + geom_density()

Otros gráficos con una variable continua

esquema ggplot2 vairable continua

 

Ejercicio 1


Los ejemplos en el diagrama de arrriba se pueden correr de la siguiente forma:

c <- ggplot(data = ToothGrowth, aes(x = len))

c + geom_area(stat = "bin")

c2 <- ggplot(ToothGrowth)

c2 + geom_qq(aes(sample = len))

1.a Corra al menos otros 3 tipos de gráficos con una variable como los que se muestran en la imagen de arriba


Dos o mas variables

Diagramas de cajas (boxplots)

Otra forma de mostrar la distribución de variables entre grupos son los diagramas de caja. Los diagramas de caja grafican diferentes propiedades de una distribución:

  • Los bordes del cuadro indican el percentil 25 y 75
  • La línea dentro del cuadro indica la mediana
  • La posición de los bigotes (líneas verticales) denota el valor del primer cuartil menos 1,5 veces el rango intercuartílico y el valor del tercer cuartil más 1,5 veces el rango intercuartílico 😱
  • Los puntos denotan valores atípicos (valores que se encuentran fuera de los bigotes), si corresponde

En ggplot2 podemos graficar diagramas de caja a través de múltiples variables usando el objeto geométricogeom_boxplot ().

ggplot(data = ToothGrowth, aes(x = supp, y = len)) + 
    geom_boxplot() + labs(title = "Largo de dientes", 
    subtitle = "Fuente: datos de ejemplo 'ToothGrowth'", 
    y = "Tamaño de células del diente", x = "Tratamientos de ")

Gráficos de dispersión

Los gráficos de dispersión (entre 2 variables continuas) se pueden generar con la función geom_point(). Para esto utilicemos los datos iris:

data("iris")

gg_pnts <- ggplot(data = iris, aes(x = Sepal.Length, 
    y = Sepal.Width)) + geom_point()

gg_pnts

A este tipo de graficos le podemos añadir margenes de error con la función geom_smooth():

gg_pnts <- ggplot(data = iris, aes(x = Sepal.Length, 
    y = Sepal.Width)) + geom_point()

Recordemos que tenemos datos de 3 especies en iris. ggplot2 nos permite subdividir el gráfico en paneles usando la función facet_wrap():

gg_pnts2 <- ggplot(data = iris, aes(x = Sepal.Length, 
    y = Sepal.Width)) + geom_point() + geom_smooth(method = lm) + 
    facet_wrap(~Species, ncol = 3, scale = "free")

Modificar la apariencia de los gráficos

Los gráficos predeterminados que hemos producido carecen de etiquetas informativas. Además, es posible que deseemos cambiar la apariencia del gráfico en términos de tamaño, color, tipo de línea, etc.

Agregar título, subtítulo y títulos de ejes

Podemos especificar títulos y etiquetas de ejes dentro del argumento labs ():

ggplot(data = ToothGrowth, mapping = aes(len)) + geom_histogram(fill = "green4") + 
    labs(title = "Distribución del largo de dientes", 
        subtitle = "Fuente: datos de ejemplo 'ToothGrowth'", 
        x = "Tamaño de células del diente", y = "Densidad")

Cambiar el color

Podemos cambiar los colores facilmente dentro de cada “geom”:

ggplot(data = ToothGrowth, aes(x = len)) + geom_line(stat = "density", 
    color = "darkblue")

Cambiar la aperiencia de linea

La linea tambien la podemos cambiar dentro de los “geoms”. Por ejemplo podemos cambiar el grosor:

ggplot(data = ToothGrowth, aes(x = len)) + geom_line(stat = "density", 
    color = "#2727ff", linetype = "dotdash")

… y también el tamaño:

ggplot(data = ToothGrowth, aes(x = len)) + geom_line(stat = "density", 
    color = "#2727ff", linetype = "dotdash", size = 4)

Existen themas prediseñados que nos permiten cambiar muchas componentes de los gráficos a la vez:

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_point() + geom_smooth(method = lm) + facet_wrap(~Species, 
    ncol = 3, scale = "free") + theme_classic()

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_point() + geom_smooth(method = lm) + facet_wrap(~Species, 
    ncol = 3, scale = "free") + theme_bw()

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_point() + geom_smooth(method = lm) + facet_wrap(~Species, 
    ncol = 3, scale = "free") + theme_linedraw()

Guardar los gráficos

Esto se puede hacer facilmente de la siguiente forma:

ggsave(plot = gg_pnts2, filename = "dispersion.png", 
    width = 6, height = 3, dpi = 400)

 

Ejercicio 2


Usando los datos ChickWeight:

2a. Cree un gráfico de dispersión para el tiempo y el peso (Time y weight)

2b. Subdivida el gráfico con un panel para cada pollito

2c. Utilice 2 temas (theme_X()) diferentes a los ya usados en este tutorial


Información de la sesión

## R version 4.0.5 (2021-03-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
## LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3
## 
## locale:
##  [1] LC_CTYPE=pt_BR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=es_CR.UTF-8        LC_COLLATE=pt_BR.UTF-8    
##  [5] LC_MONETARY=es_CR.UTF-8    LC_MESSAGES=pt_BR.UTF-8   
##  [7] LC_PAPER=es_CR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_CR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] ggplot2_3.3.3  emo_0.0.0.9000 knitr_1.33    
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.6        highr_0.9         bslib_0.2.4       compiler_4.0.5   
##  [5] pillar_1.6.0      formatR_1.9       jquerylib_0.1.4   tools_4.0.5      
##  [9] digest_0.6.27     lattice_0.20-41   nlme_3.1-152      lubridate_1.7.10 
## [13] jsonlite_1.7.2    evaluate_0.14     lifecycle_1.0.0   tibble_3.1.1     
## [17] gtable_0.3.0      mgcv_1.8-35       pkgconfig_2.0.3   rlang_0.4.11     
## [21] Matrix_1.3-2      yaml_2.2.1        xfun_0.22         withr_2.4.2      
## [25] dplyr_1.0.5       stringr_1.4.0     generics_0.1.0    sass_0.3.1       
## [29] vctrs_0.3.8       tidyselect_1.1.1  grid_4.0.5        glue_1.4.2       
## [33] R6_2.5.0          fansi_0.4.2       rmarkdown_2.7     farver_2.1.0     
## [37] purrr_0.3.4       magrittr_2.0.1    splines_4.0.5     scales_1.1.1     
## [41] htmltools_0.5.1.1 ellipsis_0.3.2    assertthat_0.2.1  colorspace_2.0-0 
## [45] labeling_0.4.2    utf8_1.2.1        stringi_1.6.1     munsell_0.5.0    
## [49] crayon_1.4.1