Course
Facetas para ggplot2 en R
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)")
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)")
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)
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)
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)
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")
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)
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))
¡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)
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)
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)
¡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.
Cursos R
Course
Intermedio R
Course