Lo primero que debemos hacer es cargar las librerías que utilizaremos:
library(tidyverse)
library(here)
library(ggtext)
Trabajaremos con un dataframe formado por las siguientes variables sex, time y total_bill, el cual contiene datos de propinas entregadas en diferentes momentos del día.
subset_propina<- data.frame(
sex = factor(c("Female", "Female", "Male", "Male")),
time = factor(c("Lunch", "Dinner", "Lunch", "Dinner"), levels=c("Lunch", "Dinner")),
total_bill = c(13.53, 16.81, 16.24, 17.42))
En primer lugar, utilizaremos la función str para conocer la estructura de nuestro conjunto de datos, es decir, cuántas observaciones contiene, cuáles variables y de qué tipo son.
str(subset_propina)
## 'data.frame': 4 obs. of 3 variables:
## $ sex : Factor w/ 2 levels "Female","Male": 1 1 2 2
## $ time : Factor w/ 2 levels "Lunch","Dinner": 1 2 1 2
## $ total_bill: num 13.5 16.8 16.2 17.4
En segundo lugar, observaremos qué datos contiene nuestro set de datos.
subset_propina
## sex time total_bill
## 1 Female Lunch 13.53
## 2 Female Dinner 16.81
## 3 Male Lunch 16.24
## 4 Male Dinner 17.42
Antes de comenzar, recuerda que ggplot2 está basado en la Grámatica de gráficos en capas, por lo que, cada gráfico se contruyen en base a capas. Tampoco olvides que todo objeto de ggplot2 tiene al menos 3 componentes principales:
Datos (data): nuestro set de datos
Atributos estéticos (aes): un conjunto de mapeos estéticos entre las variables de nuestro set de datos y las propiedades visuales (tamaño, forma, etc.).
Capas (layers): al menos una capa que describe cómo representar cada observación, usualmente creada con una función geom. Además cada capa opcionalmente tiene una stat o transformación estadística, una position o posición y opcionalmente un conjunto de mapeos estéticos.
El primer argumento es el conjunto de datos. Al correr data = subset_propina, obtendremos un gráfico vacío.
Mediante el mapeo o mapping le decimos a ggplot cuáles son las variables que queremos representar mediante propiedades visuales (tamaño, color, etc.). Elegimos las variables time, total_bill y sex, donde la primera estará asignada a ‘x’, la segunda a ‘y’ y la última al atributo fill, por el cual se asignará un color de relleno por cada valor distinto de la variable sexo.
ggplot(data= subset_propina, mapping = aes(x= time, y= total_bill, fill= sex))
ggplot2 incluye muchas funciones geom, en este caso, elegimos la función geom_bar(), la cual tiene varios argumentos como mapping, data, stat, position, aes como width y color, entre otros. Nosotros, utilizaremos la opción stat="identity", la cual nos permite relacionar la altura de las barras con los valores brutos de la variable ‘y’, y la opción position = "stack", con la cual le decimos a ggplot que utilizaremos barras del tipo apiladas.
ggplot(data= subset_propina, aes(x= time, y= total_bill, fill= sex)) +
geom_bar(stat= "identity", position = "stack", width= .7, color= "black")
Si no deseas un gráfico de barras apiladas puedes usar alguna de las otras tres opciones, “identity” (identidad), “dodge” (contiguas), o “fill” (llenar).
ggplot(data= subset_propina,aes(x= time, y= total_bill, fill= sex))+
geom_bar(stat= "identity", position= "dodge", width= .7, color= "black")
ggplot(data= subset_propina, aes(x= time, y= total_bill, fill= sex))+
geom_bar(stat = "identity", position= "fill", width= .7, color= "black")
Finalmente, elijo la opción de barras contiguas ya que es más fácil comparar valores individuales cuando las barras están ubicadas una al lado de la otra.
Para renombrar los valores del eje x, correspondientes a ‘Lunch’ y ‘Dinner’, utilizamos la siguiente capa: scale_x_discrete (limit= c ("Lunch", "Dinner"), labels= c("Almuerzo", "Cena")
ggplot(data= subset_propina, aes(x= time, y= total_bill, fill= sex))+
geom_bar(stat = "identity", position= "dodge", width= .7, color= "black")+
scale_x_discrete(limit= c("Lunch", "Dinner"), labels= c("Almuerzo", "Cena"))+
scale_y_continuous(labels = scales::dollar)+
coord_cartesian()
Para cambiar la etiqueta de los ejes ‘x’ e ‘y’ y para agregar título, subtítulo y caption al gráfico utilizamos la capa labs, en donde podemos especificar las mismas. Por ahora, vamos a renombrar al eje ‘y’, agregaremos título y subtítulo al gráfico y por último, eliminaremos la etiqueta del eje ‘x’ y el título de la leyenda correspondiente a ‘sex’.
ggplot(data= subset_propina, aes(x= time, y= total_bill, fill= sex))+
geom_bar(stat = "identity", position= "dodge", width= .7, color= "black")+
scale_x_discrete(limit= c("Lunch", "Dinner"), labels= c("Almuerzo", "Cena"))+
scale_y_continuous(labels = scales::dollar)+
coord_cartesian() +
labs(x= "", y= "Propina", title= "¿Quién da más propina?", subtitle = "¿Hombres o Mujeres?", fill= ' ')
En el siguiente gráfico vamos a cambiar el color de relleno de las barras utilizando una escala manual, para lo cual es necesario agregar una capa: scale_fill_manual, en donde definiremos los colores de cada valor de la variable ‘sex’ y las etiquetas de cada uno.
ggplot(data=subset_propina, aes(x= time, y= total_bill, fill= sex)) +
geom_bar(stat = "identity", position= "dodge", width= .7, color= "black") +
scale_x_discrete(limit= c("Lunch", "Dinner"), labels=c("Almuerzo", "Cena")) +
scale_y_continuous(labels = scales::dollar) +
scale_fill_manual(values= c("#713580", "#41b6a6"), labels= c('Mujeres', 'Hombres')) + #asignamos colores y etiquetas.
coord_cartesian() +
labs(x= "", y= "Propina", title= "¿Quién da más propina?", subtitle = "¿Hombres o Mujeres?", fill=' ')
Vamos a utilizar uno de los themes clásicos que trae ggplot2, y vamos a aprovechar para cambiar la presentación de los valores del eje ‘y’.
ggplot(data=subset_propina, aes(x= time, y= total_bill, fill= sex))+
geom_bar(stat = "identity", position= "dodge", width = .7, color= "black")+
scale_fill_manual(values= c("#713580", "#41b6a6"), labels= c('Mujeres', 'Hombres'))+
scale_x_discrete(limit= c("Lunch", "Dinner"), labels= c("Almuerzo", "Cena"))+
scale_y_continuous(labels = scales::dollar)+
labs(x=" ", y="Propina", title="¿Quién da más propina?", fill= ' ')+
theme_classic()
A continuación, modificaremos el color y el tamaño tanto del título como de la leyenda del gráfico. Y por último, vamos a cambiar la posición de la leyenda correspondiente a la variable ‘Sexo’ y a renombrar cada uno de sus valores. Para cambiar dichos valores, es necesario usar la configuración del theme() ó tema. En la configuración del tema, la sentencia ‘legend.position’, controla la posición de la leyenda, por defecto, la posición es a la derecha y las restantes opciones son:
theme (legend.position = "left"theme (legend.position = "top")theme (legend.position = "bottom")ggplot(data=subset_propina, aes(x= time, y= total_bill, fill= sex))+
geom_bar(stat = "identity", position= "dodge",
width= .7, color= "#2c204d") +
scale_fill_manual(values= c("#713580", "#41b6a6"), labels= c('Mujeres', 'Hombres')) +
scale_x_discrete(limit= c("Lunch", "Dinner"), labels= c("Almuerzo", "Cena")) +
scale_y_continuous(labels = scales::dollar)+
labs(x=" ", y="Propina", title="¿Quién da más propina?", fill= ' ') +
theme_classic()+
theme(text = element_text(size=14, face = 'bold', color = "#2c204d"),
plot.title = element_text(size=18, #cambiamos el tamaño, fuente y color del título
family ="Garamond",
hjust = 0.5,vjust = 1,
colour = "#2c204d",
face = 'bold',
margin = margin(b = 12 * 1.2)),
legend.position="top",legend.text= element_text(color="#2c204d",
size= 12, hjust = 0.5,vjust = 1, family ="Garamond")) #cambiamos tamaño, fuente y color de la leyenda
Guardamos la figura obtenida en formato png y definimos la dimensión de la misma, asignando valores a los parámetros height (altura) y width (ancho).
ggsave(here("grafico_barchart2.png"), height = 8, width = 6, units = "in", type= 'cairo')
El paquete ggtext permite extender las funcionalidades de ggplot2, mediante la customización de títulos, subtítulos, anotaciones, etc. A continuación, en lugar de utilizar una leyenda para especificar los valores de la variable sex, es posible agregar a la figura un subtítulo donde la palabra ‘Hombres’ esté en verde y ‘Mujeres’ en lila para diferenciar los valores posibles de dicha variable, tal como se observa en el siguiente ejemplo:
ggplot(data=subset_propina, aes(x= time, y= total_bill, fill= sex))+
geom_bar(stat = "identity", position="dodge",
width= .7, color= "#2c204d")+
scale_fill_manual(values= c("#713580", "#41b6a6"), labels= c('Mujeres', 'Hombres'))+
scale_x_discrete(limit= c("Lunch", "Dinner"), labels= c("Almuerzo", "Cena"))+
scale_y_continuous(labels = scales::dollar)+
labs(x=" ", y="Propina", title="¿Quién da más propina?",
subtitle = "¿<span style='color:#41b6a6'>Hombres</span> o <span style='color:#713580'> Mujeres</span>?")+
theme_classic()+
theme(text = element_text(size=14, face = 'bold', color = "#2c204d"),
plot.title = element_text(size= 18, #cambiamos el tamaño, fuente y color del título
family = "Garamond",
hjust = 0.5,vjust = 1,
colour = "#2c204d",
face = 'bold',
margin = margin(b = 12 * 1.2)),
plot.subtitle = element_markdown(hjust = 0.5,vjust = 1),
legend.position= "none",legend.text= element_text(color= "#2c204d",
size= 12, hjust = 0.5,vjust = 1, family = "Garamond")) #cambiamos tamaño, fuente y color de la leyenda
ggsave(here("grafico_ggtext.png"), height = 8, width = 6, units = "in", type='cairo')
Los siguientes recursos son gratutitos y se pueden acceder de manera online:
Rcoobook - Capítulo 8.1: Bar graphs
R para Ciencia de Datos - Capítulo 3: Visualización de datos