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:
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í:
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:
ggplot()
: función para iniciar un gráfico en ggplot2
data
: especifica el marco de datos a partir del cual se produce el gráficoaes()
: 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).
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")
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()
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
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:
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 ")
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")
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.
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")
Podemos cambiar los colores facilmente dentro de cada “geom”:
ggplot(data = ToothGrowth, aes(x = len)) + geom_line(stat = "density",
color = "darkblue")
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()
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