El gran valor de una imagen es cuando nos incita a notar lo que nunca esperabamos ver
Si no lo puedo dibujar, no lo puedo explicar
- John Tukey
- 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:
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
.
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:
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
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.
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`.
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()
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.htmlSin 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
## 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()
:
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()
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.
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
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 funcionesseq()
ysequence()
.
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“.
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óricasggplot(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:
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")
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:
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'