Vai al contenuto principale

Facet per ggplot2 in R

In questo tutorial imparerai a sfruttare al meglio le funzioni di faceting di ggplot.
Aggiornato 29 set 2026  · 8 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

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

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

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

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

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

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

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

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

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

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

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

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.

Argomenti
R
Data Science

Corsi R

Corso

Introduzione a R

4 ore
3.1M
Impara le basi dell'analisi dei dati in R, compresi vettori, liste e data frame, e fai pratica con R con set di dati reali.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro