Librerías

Lo primero que debemos hacer es cargar las librerías que utilizaremos:

library(tidyverse)
library(here)
library(ggtext)

Set de datos

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))

Estructura del dataset

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

¿Comenzamos?

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.

Gráfico de barras paso a paso

Paso 1: Datos

El primer argumento es el conjunto de datos. Al correr data = subset_propina, obtendremos un gráfico vacío.

Paso 2: Atributos estéticos

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))

Paso 3: Función Geom

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")

Tipos de barras

Si no deseas un gráfico de barras apiladas puedes usar alguna de las otras tres opciones, “identity” (identidad), “dodge” (contiguas), o “fill” (llenar).

a. Gráfico de barras contiguas

ggplot(data= subset_propina,aes(x= time, y= total_bill, fill= sex))+
       geom_bar(stat= "identity", position= "dodge",  width= .7, color= "black")

b. Gráfico de barras llenas

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.

Paso 4: Sistemas de coordenadas y escalas

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()  

Paso 5: Etíquetas y guías

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= ' ')

Paso 6: ¿Cómo cambiamos el color de las barras?

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=' ') 

Paso 7: Temas

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()

¿Y si queremos cambiar el color y el tamaño del título?

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      

¿Cómo guardamos lo hecho hasta aquí?

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')

Extras

El paquete ggtext

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')

Referencias

Los siguientes recursos son gratutitos y se pueden acceder de manera online: