1 ggPlot2

El gran valor de una imagen es cuando nos incita a notar lo que nunca esperabamos ver
- John Tukey

Si no lo puedo dibujar, no lo puedo explicar
- Albert Einstein

Además de ser un lenguaje de programación para ordenar datos y realizar análisis estadísticos, R nos permite crear gráficos para visualizar los datos.

Por default, R cuenta con una serie de comandos básicos para crear y elaborar gráficos:

plot(pressure)

Sin embargo, el código generado para crear estos gráficos es abstracto y difícil de comprender para los usuarios. Adicionalmente, el gráfico resultante carece de elementos estéticos que dificilmente satisfacen los requerimientos para publicarlo. Para solucionar este problema, ggplot2 (Wickham 2016) fue creado para customizar los gráficos y añadir elementos relacionados con el análisis de los datos (entre otras funciones).

Como parte de tidyverse (Wickham et al. 2019), la sintaxis para crear gráficos usando ggplot2 se basa en el uso de verbos que facilitan al usuario comprender el código de lo que se está graficando. Principalmente, los gráficos se crean por el apilamiento de capas de elementos gráficos:

Sintaxis y gramática para generar gráficos en ggplot2. Tomado de https://rpubs.com/Mentors_Ubiqum/ggplot_workshop

Te recomiendo visitar la página de RGraph Gallery para que explores la diversidad de gráficos que se pueden generar con ggplot2.

2 Sintaxis de ggplot2

Previamente a la creación de gráficos con ggplot2 o cualquier otro software, es importante que definas el objetivo de crear un gráfico y conozcas la naturaleza de las variables a graficar (categóricas, numéricas, discretas, continuas…), así como su distribución.

La sintaxis para elaborar gráficos en ggplot2 se compone de los siguientes elementos:

    1. Datos: data frame y las variables a graficar (aesthetics)
    1. Geometría: Tipo de gráfico (histogramas, de barras, de puntos, de lineas, pastel, cajas/bigotes…)
    1. Estadisticos: Transformaciones estadísticas que resumen los datos (media, mediana, intervalos de confianza)
    1. Escalas: Títulos de los ejes y valores para modificar la estética (color, forma, tamaño) de los datos
    1. Sistema de coordenadas: El plano en el cual se está graficando
    1. Paneles: Valor opcional si se desean crear multiples gráficas a partir de variables categóricas

2.1 Datos y aesthetics

Para crear un gráfico en ggplot2, se requiere utilizar la función ggplot() y dentro de ella especificar el data frame que contiene los datos. En el argumento aes() se indican las variables (x y) a graficar. Como ejemplo utilizaremos el data set mpg

##Utiliza la función ggplot para crear un gráfico de una variable fl
ggplot(mpg, aes(x = fl))

De esta manera se produce una gráfica de un solo plano en donde se visualizan los ejes x/y y la variable fl en x. Sin embargo, no hay ningún dato graficado.

2.2 Geometría

Para graficar los datos se requiere adicionar una capa utilizando un símbolo + seguidamente de la función ggplot():

##Genera una gráfica de puntos con los comandos previamente utilizados
ggplot(mpg, aes(x = hwy)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

2.2.1 Una variable continua

Para graficar una sola variable continua, utilizaremos las funciones geom_histogram() y geom_density()

##Graficar la frecuencia en la distribución del Sepal.Length
ggplot(mpg, aes(x = hwy)) +
  geom_histogram() 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
##Graficar la densidad en la distribución del Sepal.Length
ggplot(mpg, aes(x = hwy)) +
  geom_density()

En el caso de tener una variable categórica o discreta se emplea la función geom_bar():

##Crear una gráfica de barras de acuerdo al tipo de combustible de los autos 
ggplot(mpg, aes(x = fl)) +
  geom_bar()

2.2.2 Dos variables

Cuando los datos provienen de dos variables contínuas, se emplea el gráfico de puntos o scatter plot con la función geom_point().

##Graficar las millas recorridas por galón de combustible en ciudad o carretera
ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point()

Los atributos para modificar el color de relleno, contorno, la forma y el tamaño de los puntos indican con dentro del comando geom_point():

El color de relleno de los datos se indica entre comillas empleando los nombres de los colores contenidos dentro de esta esta lista:

<p class”footnote”>Ejemplo de colores, tonos y sus nombres en R. Tomada de https://bookdown.org/hneth/ds4psy/2.3-visualize:essential-ggplot.html

Sin embargo, la lista no está limitada a estos colores. Puedes utilizar el valor hexadecimal del color que más te guste. Para ello, consulta la página color.co para generar paletas de colores y obtengas el valor hexadecimal

##Color utilizando nombres
ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point(color = "firebrick")

##Color utilizando valores hexadecimales
ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point(color = "#C86FC9")

Para modificar la forma de los puntos, en el argumento shape se utilizan valores numéricos que hacen referencia a esta lista:

Variantes de figuras a utilizar en R para gráficos de puntos. Tomada de https://osoramirez.github.io/R_Para_Biologos/intro.html

##Cambiar la forma 
ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point(shape = 15)

##Cambiar la forma y el tamaño de los puntos
ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point(shape = 15, size = 5)

Una función útil de ggplot es que el color de los puntos o elementos de un gráfico se puede establecer de acuerdo a una variable categórica. Es decir, de acuerdo a los niveles de la variable categórica es el color de los elementos. Para ello, visualicemos la estructura del data frame mpg

str(mpg)
## tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
##  $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
##  $ model       : chr [1:234] "a4" "a4" "a4" "a4" ...
##  $ displ       : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr [1:234] "f" "f" "f" "f" ...
##  $ cty         : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr [1:234] "p" "p" "p" "p" ...
##  $ class       : chr [1:234] "compact" "compact" "compact" "compact" ...

La columna class corresponde a una variable categórica con siete niveles: 2seater,compact, midsize, minivan, pickup, subcompact y suv. Dentro del argumento aes() de la función ggplot() indicaremos que el color de los puntos sea de acuerdo a la variable o columna class:

##Colorea los puntos de acuerdo a los valores de una variable categórica
ggplot(mpg, aes(x = cty, y = hwy, color = class)) +
  geom_point()

La forma de los puntos también se puede modificar de acuerdo a una variable categórica. El tamaño de los puntos se modifica de acuerdo a una variable numérica y contínua.

##Colorea los puntos y modifica su forma de acuerdo a los valores de una variable categórica
ggplot(mpg, aes(x = cty, y = hwy, color = class, shape = fl)) +
  geom_point()

##Modifica el tamaño de los puntos de acuerdo a los valores de Sepal.Width
ggplot(mpg, aes(x = cty, y = hwy, color = class, shape = fl, size = cyl)) +
  geom_point()

Para datos provenientes de una variable contínua y una categórica se emplean los gráficos de cajas y bigotes, de violín, de puntos o de barras. Para crear un gráfico de cajas y bigotes la función a emplear es geom_boxplot():

##Crear un gráfico de cajas y bigotes visualizando las millas recorridas por galón en carretera de acuerdo a la clase del auto
ggplot(mpg, aes(x = class, y = hwy)) +
  geom_boxplot()

Las gráficas de violín se crean con la función geom_violin():

ggplot(mpg, aes(x = class, y = hwy)) +
  geom_violin()

Para modificar el color de acuerdo a los grupos o niveles de la variable categórica, se procede de la misma manera cuando se generó el gráfico de puntos. En este caso se utiliza el argumento fill:

##Modifica el color de las cajas y bigotes o violines de acuerdo a los niveles de la variable class
ggplot(mpg, aes(x = class, y = hwy, fill = class)) +
  geom_boxplot()

ggplot(mpg, aes(x = class, y = hwy, fill = class)) +
  geom_violin()

2.3 Estadísticos

La transformaciones estadísticas de los datos, o stat, resume los valores estadísticos de los datos. Para realizar estas transformaciones estadísticas, se añade una capa con las funciones stat_...() En el siguiente ejemplo, se modifica el número de cajas de un histograma:

##Codigo para crear un histograma con un número de cajas de 30 
ggplot(mpg, aes(x = hwy)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
##Con la función stat_bin se modifica el número de cajas a 20
ggplot(mpg, aes(x = hwy)) +
  stat_bin(bins = 20)

Adicionalmente, con las funciones stat se calculan valores como la media de alguna variable y se grafica. En el siguiente ejemplo se calcula la media de hwy usando la función stat_summary():

##Transformar los datos calculando y añadiendo la media del Sepal.Length
ggplot(mpg, aes(x = class, y = hwy)) +
  geom_point() +
  stat_summary(geom = "point", fun = "mean", color = "red", size = 4)

Finalmente, las transformaciones estadísticas permiten añadir líneas de tendencia para análisis de regresión. La función stat_smooth() añade una linea de tendencia en gráficos de puntos para dos variables continuas:

##Añadir una línea de tendencia a un gráfico de puntos
ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point() +
  stat_smooth(geom = "smooth", method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

La variedad de transformaciones estadísiticas que se pueden realizar alos gráficos de ggplot2 las puedes consultar en https://ggplot2-book.org/statistical-summaries.

2.4 Escalas

Las escalas en ggplot2 controlan los valores estéticos de una gráfica. En otras palabras, convierten los valores de las variables de los datos en algo graficable como el color, la forma, el tamaño o la posición.

Las escalas se dividen en tres categorías: - Escalas de posición y ejes - Escalas de color y leyendas - Escalas para tamaño, forma, grosor y tipo de figuras

2.4.1 Escalas de posición y ejes

Las escalas de posición y ejes controlan la localización de los elementos visuales de una gráfica. En el caso de gráficos en dos dimensiones, existen dos escalas correspondientes a los elementos en los ejes x y. Para variables contínuas, ggplot utiliza por default las funciones scale_x_continous() y scale_y_continous() para graficar de forma lineal ambos ejes. Sin embargo, existen otro tipos de escalas y transformaciones como scale_x_log10() la cual transforma logaritmicamente los datos:

ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point()
  
ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point() +
  scale_x_log10()

Ggplot2, establece los límites numéricos de los ejes al determinar el rango de cada un de ellos. Sin embargo, resulta conveniente modificar los limites de los ejes en algunos gráficos. Para ello se utiliza el argumento limits dentro de los comandos scale_x_continous() y scale_y_continous() y los limites se indican como un vector:

ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point()

ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point() +
  scale_x_continuous(limits = c(0, 50)) +
  scale_y_continuous(limits = c(0, 50))

En ggplot tambien es posible ajustar las marcas de los ejes axis breaks, lo cual es una tarea indispensable para mejorar nuestros gráficos. Dentro de los comandos scale_x_continous() y scale_y_continous() colocamos el argumento breaks:

ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point()

ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point() +
  scale_x_continuous(breaks = c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50), 
                     limits = c(0, 50))

Para colocar secuencias numéricas recuerda utilizar las funciones seq() y sequence().

Para un mayor conocimiento de todas las escalas de posición que ggplot2 controla, te recomiendo visitar la página de https://ggplot2-book.org/scales-position“.

2.5.2 Escalas de color

Las escalar de color utilizan gradientes que se acoplan de acuerdo a las variables de nuestros datos:

  • scale_fill_continous() es el comando para generar gradientes de color usando como base variables continuas.
  • scale_fill_discrete() es el comando para generar gradientes de color usando como base variables categóricas
ggplot(mpg, aes(x = cty, y = hwy, color = displ)) +
  geom_point() +
  scale_color_continuous()

ggplot(mpg, aes(x = class, y = hwy, fill = class)) +
  geom_boxplot() +
  scale_fill_discrete()

Sin embargo, en ambos casos existen paletas de colores establecidas y que forman parte de los paquetes viridis y RColorBrewer.
RColorBrewer (Neuwirth 2022)utiliza colores de las paletas de https://colorbrewer2.org. Existen distintas paletas:

display.brewer.all()

Usando el comando scale_fill_brewer(palette=) se coloca la capa de color a las graficas:

ggplot(mpg, aes(x = class, y = hwy, fill = class)) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Spectral")

ggplot(mpg, aes(x = class, y = hwy, fill = class)) +
  geom_violin() +
  scale_fill_brewer(palette = "YlOrRd")

Para variables contínuas, las paletas del paquete viridis (Garnier et al. 2023)ofrecen una amplia de colores y gradientes:

Paletas de colores del paquete viridis. Tomada de https://bookdown.org/hneth/ds4psy/D-4-apx-colors-pkgs.html

Al usarlas solo se requieren usar la función scale_fill_viridis(option=) e indicar el nombre de la paleta:

ggplot(mpg, aes(x = cty, y = hwy, color = displ, size = displ)) +
  geom_point() +
  scale_color_viridis(option = "viridis")

ggplot(mpg, aes(x = cty, y = hwy, color = displ, size = displ)) +
  geom_point() +
  scale_color_viridis(option = "magma")

Si ninguna de las paletas de colores o gradientes te convence, puedes optar por utilizar tus colores favoritos empleando la función scale_fill_manual(). Esta función resulta útil cuando quieres resaltar algún dato importante en los gráficos. Dentro de la función debes indicar, con el argumento values, en un vector los nombres de los colores (nombres o valores hexadecimales)

ggplot(mpg, aes(x = drv, y = displ, fill = drv)) +
  geom_bar(stat = "identity") +
  scale_fill_manual(values = c("darkblue", "cornflowerblue", "lightblue2"))

ggplot(mpg, aes(x = fl, y = cty, fill = fl)) +
  geom_boxplot() +
  scale_fill_manual(values = c("gray", "firebrick", "gray", "gray", "gray"))

Sin embargo, si requieres descargar más escalas de colores (discretas o contínuas) te recomiendo instalar los paquetes ggpubr (Kassambara 2023), ggsci(Xiao 2023) y paletteer (Hvitfeldt 2021) para crear gráficos con paletas de colores listas para publicaciones:

p1 + 
  scale_color_npg()
## `geom_smooth()` using formula = 'y ~ x'
p1 + 
  scale_color_jco()
## `geom_smooth()` using formula = 'y ~ x'

Referencias

Garnier, Simon, Ross, Noam, Rudis, Robert, Camargo, et al. 2023. viridis(Lite) - Colorblind-Friendly Color Maps for r. https://doi.org/10.5281/zenodo.4679423.
Hvitfeldt, Emil. 2021. Paletteer: Comprehensive Collection of Color Palettes. https://github.com/EmilHvitfeldt/paletteer.
Kassambara, Alboukadel. 2023. Ggpubr: ’Ggplot2’ Based Publication Ready Plots. https://CRAN.R-project.org/package=ggpubr.
Neuwirth, Erich. 2022. RColorBrewer: ColorBrewer Palettes. https://CRAN.R-project.org/package=RColorBrewer.
Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the Tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Xiao, Nan. 2023. Ggsci: Scientific Journal and Sci-Fi Themed Color Palettes for ’Ggplot2’. https://CRAN.R-project.org/package=ggsci.