Saltar al contenido principal
InicioTutorialesProgramación R

Facetas para ggplot2 en R

En este tutorial aprenderás a aprovechar al máximo las funciones de facetado de ggplots.
Actualizado 11 sept 2024  · 8 min leer

Introducción

Con el facetado, puedes hacer gráficos de varios paneles y controlar cómo se relacionan las escalas de un panel con las escalas de otro.

Uso sencillo de las facetas

Si estás familiarizado con ggplot2, conocerás la estructura básica de una llamada a la función ggplot(). Para una introducción a ggplot2, puedes consultar nuestro curso sobre ggplot2. Cuando llamas a ggplot, proporcionas una fuente de datos, normalmente un marco de datos, y luego pides a ggplot que asigne diferentes variables de nuestra fuente de datos a diferentes estéticas, como la posición de los ejes x o y o el color de nuestros puntos o barras. Con las facetas, obtienes una forma adicional de asignar las variables. Para demostrarlo, utilizarás el siguiente conjunto de datos, que incluye una serie de indicadores económicos de una selección de países. La mayoría son variantes del PIB, el Producto Interior Bruto de cada país.

 print(econdata)
##   Country  GDP_nom  GDP_PPP GDP_nom_per_capita GDP_PPP_per_capita
## 1     USA 19390600 19390600              59501              59495
## 2  Canada  1652412  1769270              45077              48141
## 3   China 12014610 23159107               8643              16807
## 4   Japan  4872135  5428813              38440              42659
## 5  France  2583560  2835746              39869              43550
## 6 Germany  3684816  4170790              44550              50206
## 7  Sweden  3684816   520937              53218              51264
## 8 Ireland   333994   343682              70638              72632
##   GNI_per_capita        Region
## 1          58270 North America
## 2          42870 North America
## 3           8690          Asia
## 4          38550          Asia
## 5          37970        Europe
## 6          43490        Europe
## 7          52590        Europe
## 8          55290        Europe

Están presentes las siguientes variables:

País: Se explica por sí mismo.

GDP_nom: Producto Interior Bruto como valor nominal en USD

GDP_PPP: Producto Interior Bruto controlado por el diferente poder adquisitivo

GDP_nom_per_capita: Producto Interior Bruto como valor nominal en USD per cápita

GDP_PPP_per_capita: Producto Interior Bruto controlado por el diferente poder adquisitivo per cápita

GNI_per_capita: Renta Nacional Bruta de cada país per cápita.

Región: región del mundo donde se encuentra el país.

Para empezar, hagamos un simple diagrama de barras del PIB nominal de cada país.

ggplot(econdata, aes(x=Country, y=GDP_nom))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (nominal)")
parcela

También puedes trazar otra variable, el PIB ajustado a la PPA.

ggplot(econdata, aes(x=Country, y=GDP_PPP))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (PPP)")
parcela

Esto te proporciona un segundo gráfico independiente, similar al anterior, pero utilizando una variable diferente. Supongamos que quieres trazar conjuntamente el PIB (nominal) y el PIB (PPA). Para ello utilizarás el facetado. En primer lugar, tendrás que reformatear tus datos, cambiándolos de un formato "ancho" con cada variable en su propia columna a un formato "largo", en el que utilizas una columna para tus medidas y otra para una variable clave que nos indica qué medida utilizamos en cada fila.

econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))

Una vez que tengas los datos en ese formato, podrás utilizar nuestra variable clave para trazar con facetas. Construyamos un gráfico sencillo, que muestre tanto el PIB nominal (de nuestro primer gráfico) como el PIB (PPA) (de nuestro segundo gráfico). Para ello, sólo tienes que modificar tu código para añadir +facet_wrap() y especificar que ~measure, nuestra variable clave, debe utilizarse para el facetado.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure)
parcela

Esto funciona, pero te darás cuenta de lo aplastados que están los nombres de los países. Reorganicemos nuestros paneles.

Personalizar el diseño y reordenar

El comando facet_wrap() elegirá automáticamente cuántas columnas utilizar. Puedes especificarlo directamente utilizando ncol=, así:

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1)
parcela

Probablemente te hayas dado cuenta de que los países, en el eje x de arriba, están ordenados alfabéticamente. Si quieres cambiar esto, la forma más fácil de hacerlo es ajustar los niveles del factor Country. Realicemos esta reordenación, disponiendo los países por orden de PIB nominal total.

econdata$Country <- factor(econdata$Country, levels= econdata$Country[order(econdata$GDP_nom)])


econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1)
parcela

También puedes hacer alguna personalización extra, como mover las etiquetas de las facetas al lado izquierdo con el argumento strip.position.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, strip.position = "left")
parcela

Facetas de etiquetado

Te habrás dado cuenta de que las facetas tienen títulos cortos y sencillos, tomados de los niveles del factor measure. Pongamos esto en orden y demos a nuestras facetas unas etiquetas más bonitas. Para ello, crearás una sencilla función etiquetadora, variable_labeller, que devolverá el nombre apropiado cuando se le pregunte por uno de los valores de variable_names. A continuación, pasas esta función al argumento labeller de facet_wrap.

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" ,
  "GDP_PPP" = "GDP (purchasing power parity)"
)


variable_labeller <- function(variable,value){
  return(variable_names[value])
}


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, labeller=variable_labeller)
parcela

Jugar con las escalas y el espacio

Construyamos un gráfico facetado más amplio, utilizando cada una de las medidas económicas.

econdatalong <- gather(econdata, key="measure", value="value", c( "GDP_nom" , "GDP_PPP" ,"GDP_nom_per_capita", "GDP_PPP_per_capita" ,"GNI_per_capita"))

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" ,
  "GDP_PPP" = "GDP (purchasing power parity)",
  "GDP_nom_per_capita" = "GDP (nominal) per capita",
  "GDP_PPP_per_capita" = "GDP (purchasing power parity) per capita",
  "GNI_per_capita"  = "GNI per capita"
)


variable_labeller <- function(variable,value){
  return(variable_names[value])
}



ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, labeller= variable_labeller)+
scale_y_continuous(breaks = pretty(econdatalong$value, n = 10))
parcela

¡Eso no está nada bien! No puedes ver los valores de tres de los paneles. ¿Por qué? Echemos un vistazo a los datos primarios para ver por qué.

summary(econdata)
##     Country     GDP_nom            GDP_PPP         GDP_nom_per_capita
##  Ireland:1   Min.   :  333994   Min.   :  343682   Min.   : 8643     
##  Canada :1   1st Qu.: 2350773   1st Qu.: 1457187   1st Qu.:39512     
##  France :1   Median : 3684816   Median : 3503268   Median :44814     
##  Germany:1   Mean   : 6027118   Mean   : 7202368   Mean   :44992     
##  Sweden :1   3rd Qu.: 6657754   3rd Qu.: 8919260   3rd Qu.:54789     
##  Japan  :1   Max.   :19390600   Max.   :23159107   Max.   :70638     
##  (Other):2                                                           
##  GDP_PPP_per_capita GNI_per_capita            Region
##  Min.   :16807      Min.   : 8690   Asia         :2  
##  1st Qu.:43327      1st Qu.:38405   Europe       :4  
##  Median :49174      Median :43180   North America:2  
##  Mean   :48094      Mean   :42215                    
##  3rd Qu.:53322      3rd Qu.:53265                    
##  Max.   :72632      Max.   :58270                    
##

Si echas un vistazo a cada columna, verás que los valores de cada columna oscilan en varios órdenes de magnitud. Por defecto, el facetado utilizará los mismos límites y rangos para los ejes X e Y. Para cambiar esto, puedes añadir este fragmento a tu código de facetas: scales="free_y" para que cada faceta utilice su propia escala independiente.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, scales="free_y", ncol=1,  labeller= variable_labeller)
parcela

Esto es mucho mejor. Cada faceta tiene ahora su propio eje y independiente.

Utilizar facetas para crear subdivisiones

Habrás observado que nuestro conjunto de datos también incluye la variable Region, que denota en qué región se encuentra el país en cuestión. Puedes utilizar esta variable para colorear nuestras barras según la región, como se indica a continuación:

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_wrap(~measure, scales="free_y", ncol=1, labeller= variable_labeller)
parcela

Sin embargo, esto es un poco lioso, ¿no estaría bien que pudieras poner cada una de las diferentes regiones en su propio subpanel? Pues con el facetado, ¡sí puedes! Aquí vas a utilizar facet_grid en lugar de facet_wrap, ya que eso facilitará la asignación de nuestras facetas a dos variables, Region y measure, donde estas dos variables están repartidas por las filas y columnas de una cuadrícula de parcelas. Ten en cuenta que también estás configurando scales="free" y space="free", lo que permite que nuestros distintos paneles ocupen diferentes cantidades de espacio. También tendrás que crear una nueva función etiquetadora, que producirá nombres tanto para las filas como para las etiquetas.

variable_names <- list(
  "GDP_nom" = "GDP \n(nominal)" ,
  "GDP_PPP" = "GDP \n(PPP)",
  "GDP_nom_per_capita" = "GDP (nominal)\n per capita",
  "GDP_PPP_per_capita" = "GDP (PPP)\n per capita",
  "GNI_per_capita"  = "GNI \nper capita"
)



region_names <- levels(econdata$Region)


variable_labeller2 <- function(variable,value){
  if (variable=='measure') {
  return(variable_names[value])
  } else {
    return(region_names)
  }
}

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_grid(measure~Region, scales="free", space="free_x",  labeller= variable_labeller2)
parcela

¡Ahora está mucho más claro! Cada región tiene su propia columna de paneles, y cada métrica tiene su propia fila de barras.

Con esto hemos terminado este tutorial. Espero que te haya gustado aprender sobre las facetas.

Si quieres aprender más sobre las facetas, sigue el curso de DataCamp Visualizar Big Data con Trelliscope.

Consulta nuestra página Introducción al Tidyverse: Tutorial.

Temas

Cursos R

Certificación disponible

Course

Introducción a R

4 hr
2.7M
Domina los fundamentos del análisis de datos en R, incluyendo vectores, listas y marcos de datos, y practica R con conjuntos de datos reales.
See DetailsRight Arrow
Start Course
Ver másRight Arrow