Corso
Introduzione
Con il faceting puoi creare grafici multi-pannello e controllare come le scale di un pannello si rapportano a quelle di un altro.
Uso semplice dei facet
Se hai un minimo di familiarità con ggplot2, conosci la struttura di base di una chiamata alla funzione ggplot(). Per un'introduzione a ggplot2, dai un'occhiata al nostro corso su ggplot2. Quando chiami ggplot, fornisci una sorgente dati, di solito un data frame, poi chiedi a ggplot di mappare diverse variabili della sorgente dati a diverse proprietà estetiche, come la posizione sugli assi x o y o il colore dei punti o delle barre. Con i facet ottieni un ulteriore modo per mappare le variabili. Per dimostrarlo, userai il seguente dataset, che include vari indicatori economici per una selezione di paesi. La maggior parte di questi sono varianti del PIL, il Prodotto Interno Lordo di ciascun paese.
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
Sono presenti le seguenti variabili:
Country: autoesplicativo!
GDP_nom: Prodotto Interno Lordo come valore nominale in USD
GDP_PPP: Prodotto Interno Lordo corretto per il diverso potere d'acquisto
GDP_nom_per_capita: Prodotto Interno Lordo come valore nominale in USD su base pro capite
GDP_PPP_per_capita: Prodotto Interno Lordo corretto per il diverso potere d'acquisto su base pro capite
GNI_per_capita: Reddito Nazionale Lordo di ciascun paese su base pro capite.
Region: regione del mondo in cui si trova il paese.
Per iniziare, facciamo un semplice barplot del PIL nominale di ciascun paese.
ggplot(econdata, aes(x=Country, y=GDP_nom))+
geom_bar(stat='identity', fill="forest green")+
ylab("GDP (nominal)")

Puoi anche tracciare un'altra variabile, il PIL corretto per PPP.
ggplot(econdata, aes(x=Country, y=GDP_PPP))+
geom_bar(stat='identity', fill="forest green")+
ylab("GDP (PPP)")

Questo ti dà un secondo grafico separato, simile al precedente ma che usa una variabile diversa. Mettiamo di voler tracciare insieme il PIL (nominale) e il PIL (PPP). Userai il faceting per farlo. Per prima cosa, devi riformattare i dati, passando da un formato "wide", con ciascuna variabile nella propria colonna, a un formato "long", in cui usi una colonna per le misure e un'altra per una variabile chiave che indica quale misura usiamo in ciascuna riga.
econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))
Una volta che hai i dati in questo formato, puoi usare la nostra variabile chiave per tracciare con i facet. Costruiamo un grafico semplice, che mostri sia il PIL nominale (dal primo grafico) sia il PIL (PPP) (dal secondo). Per farlo, ti basta modificare il codice aggiungendo +facet_wrap() e specificare che ~measure, la nostra variabile chiave, venga usata per il faceting.
ggplot(econdatalong, aes(x=Country, y=value))+
geom_bar(stat='identity', fill="forest green")+
facet_wrap(~measure)

Funziona, ma noterai che i nomi dei paesi sono schiacciati. Riorganizziamo i pannelli.
Personalizzare il layout e riordinare
Il comando facet_wrap() sceglie automaticamente quante colonne usare. Puoi specificarlo direttamente con ncol=, così:
ggplot(econdatalong, aes(x=Country, y=value))+
geom_bar(stat='identity', fill="forest green")+
facet_wrap(~measure, ncol=1)

Avrai probabilmente notato che i paesi, sull'asse x qui sopra, sono disposti in ordine alfabetico. Se vuoi cambiare questo ordine, il modo più semplice è impostare i livelli del fattore Country. Facciamo questo riordino, disponendo i paesi in ordine di PIL nominale totale.
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)

Puoi anche fare qualche personalizzazione in più, ad esempio spostare le etichette dei facet sul lato sinistro con l'argomento strip.position.
ggplot(econdatalong, aes(x=Country, y=value))+
geom_bar(stat='identity', fill="forest green")+
facet_wrap(~measure, ncol=1, strip.position = "left")

Etichettare i facet
Avrai notato che i facet hanno intestazioni brevi, prese dai livelli del fattore measure. Mettiamo un po' d'ordine e diamo ai nostri facet etichette più chiare. Per farlo, creerai una semplice funzione di labelling, variable_labeller, che restituirà il nome appropriato quando le viene chiesto uno dei valori di variable_names. Poi passerai questa funzione all'argomento labeller di 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)

Giocare con scale e spazi
Costruiamo un grafico con più facet, usando ciascuna delle misure economiche.
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))

Così non va affatto bene! Non puoi vedere i valori per tre dei pannelli. Perché? Diamo un'occhiata ai dati di partenza per capirlo.
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
##
Guardando ogni colonna, vedi che i valori in ciascuna colonna coprono alcuni ordini di grandezza. Per impostazione predefinita, il faceting userà gli stessi limiti e intervalli sia per l'asse X che per l'asse Y. Per cambiarlo, puoi aggiungere questo snippet al codice di faceting: scales="free_y" così che ogni facet usi una scala indipendente.
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)

Molto meglio. Ogni facet ha ora il proprio asse y indipendente.
Usare i facet per creare suddivisioni
Avrai notato che il nostro dataset include anche la variabile Region, che indica in quale regione si trova il paese in questione. Puoi usare questa variabile per colorare le barre in base alla regione, così:
ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
geom_bar(stat='identity')+
facet_wrap(~measure, scales="free_y", ncol=1, labeller= variable_labeller)

Tuttavia, è un po' disordinato: non sarebbe meglio se potessi mettere ciascuna regione nel proprio sotto-pannello? Con il faceting puoi! Qui userai facet_grid invece di facet_wrap, perché rende facile mappare i facet a due variabili, Region e measure, distribuite su righe e colonne di una griglia di grafici. Nota che stai anche impostando scales="free" e space="free", permettendo ai diversi pannelli di occupare quantità di spazio differenti. Dovrai anche creare una nuova funzione di labelling, che produca i nomi sia per le righe sia per le colonne.
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)

Adesso è molto più chiaro! Ogni regione ha la propria colonna di pannelli e ogni metrica ha la propria riga di barre.
Direi che per questo tutorial è tutto. Spero ti sia piaciuto imparare a usare i facet.
Se vuoi approfondire i facet, segui il corso di DataCamp Visualizing Big Data with Trelliscope.
Dai un'occhiata al nostro Guida introduttiva al Tidyverse: Tutorial.

