venerdì 13 dicembre 2024

Grafici a torta (pie chart) con ggplot

In ggplot2 non è prevista una funzione specifica per i grafici a torta (pie chart) che però possono essere realizzati trasformando le coordinate di un semplice grafico a barre in coordinate polari.

Copiate e incollate nella Console di R questo script e premete ↵ Invio.

# GRAFICO A BARRE con ggplot
#
library(ggplot2) # carica il pacchetto per la grafica
val <- c(72, 29, 36, 12) # valori
eti <- c("AB","Ab","aB","ab") # etichette
mydata <- data.frame(val, eti) # tabella contenente i dati
windows() # apre e inizializza una nuova finestra grafica
#
ggplot(mydata, aes(x="", y=val, fill=eti)) + geom_col(position=position_dodge()) # grafico a barre 
#

Il grafico a barre viene realizzato con la funzione geom_col() che genera barre con una altezza uguale al valore val (con la funzione geom_bar() sono generate invece barre con una altezza proporzionale al numero di casi conteggiati). L'argomento fill riporta un colore differenziato per ciascuno dai valori assunti dalla variabile eti mentre all'argomento position viene assegnato il valore necessario per riportare le barre una accanto all'altra (senza questo risulterebbero impilate).

Ora copiate e incollate nella Console di R questo script e premete ↵ Invio.
 
# GRAFICO A TORTA con ggplot
#
library(ggplot2) # carica il pacchetto per la grafica
val <- c(72, 29, 36, 12) # valori
eti <- c("AB","Ab","aB","ab") # etichette
mydata <- data.frame(val, eti) # tabella contenente i dati
windows() # apre e inizializza una nuova finestra grafica
#
ggplot(mydata, aes(x="", y=val, fill=eti)) + geom_col() + coord_polar(theta="y") # grafico a torta
#

Rispetto allo script precedente vi sono due sole differenze:
 l'argomento position non viene più impiegato e scompare dalla funzione geom_col();
 è stata aggiunta la funzione coord_polar() che riporta il grafico a barre in coordinate polari trasformandolo così in un grafico a torta.

Ed ecco i risultati dei due script, quelli del primo script a sinistra e quelli del secondo sulla destra.


Chiarito subito questo punto, realizzare i grafici a torta con le funzioni del pacchetto ggplot2 diventa semplice. Qui riporto tre esempi che illustrano altrettante varianti che possono aiutare a familiarizzare con le funzioni richieste.

I dati, tratti da Marubini [1], sono rappresentati dal numero di individui prodotti per ciascuna delle varietà AB, Ab, aB, ab in un esperimento di ibridazione di specie vegetali, che erano rispettivamente:

AB
Ab
aB
ab
72
29
36
12

Ecco il primo esempio e variante del codice base per realizzare un grafico a torta riportato nello script precedente.
 
# GRAFICO A TORTA con ggplot
# con valori numerici
#
library(ggplot2) # carica il pacchetto per la grafica
val <- c(72, 29, 36, 12) # valori
eti <- c("AB","Ab","aB","ab") # etichette
mydata <- data.frame(val, eti) # tabella contenente i dati
windows() # apre e inizializza una nuova finestra grafica
#
ggplot(mydata, aes(x="", y=val, fill=eti)) + geom_col() + coord_polar(theta="y") + geom_text(aes(label=val), position=position_stack(vjust=0.5)) 
# grafico a torta
#

Qui è stata semplicemente aggiunta la funzione geom_text() per riportare al centro (vjust=0.5degli spicchi della torta i valori numerici (label=val) corrispondenti, cosa che sicuramente migliora molto la presentazione dei dati.


Per completare il grafico non resta che aggiungere titolo e voci della legenda.
 
# GRAFICO A TORTA con ggplot
# con valori numerici, titolo e voci della legenda
#
library(ggplot2) # carica il pacchetto per la grafica
val <- c(72, 29, 36, 12) # valori
eti <- c("AB","Ab","aB","ab") # etichette
mydata <- data.frame(val, eti) # tabella contenente i dati
windows() # apre e inizializza una nuova finestra grafica
#
ggplot(mydata, aes(x="", y=val, fill=eti)) + geom_col() + coord_polar(theta="y") + geom_text(aes(label=val), position=position_stack(vjust=0.5)) + theme(legend.position="bottom") + labs(title="Individui prodotti per ciascuna varietà", x="", y="") + theme(plot.title=element_text(hjust=0.5)) + scale_fill_discrete(name="Varietà", labels=c("ab", "aB", "Ab", "AB"))
#

In questo caso:
 con theme() la legenda viene spostata in basso;
 con labs() viene aggiunto un titolo, che con theme() viene centrato (hjust=0.5);
 con scale_fill_discrete() sono riportati titolo della legenda e descrizioni delle variabili (che in genere sono diverse dai nomi della variabili impiegate nella tabella che contiene i dati).


Infine con quest'ultima variante applichiamo agli spicchi del grafico nostri colori personalizzati [2]
 
# GRAFICO A TORTA con ggplot
# con valori numerici, titolo, voci della legenda e colori personalizzati
#
library(ggplot2) # carica il pacchetto per la grafica
val <- c(72, 29, 36, 12) # valori
eti <- c("AB","Ab","aB","ab") # etichette
mydata <- data.frame(val, eti) # tabella contenente i dati
windows() # apre e inizializza una nuova finestra grafica
#
ggplot(mydata, aes(x="", y=val, fill=eti)) + geom_col() + coord_polar(theta="y") + geom_text(aes(label=val), position=position_stack(vjust=0.5)) + theme(legend.position="bottom") + labs(title="Individui prodotti per ciascuna varietà", x="", y="") + theme(plot.title=element_text(hjust=0.5)) + scale_fill_manual(name="Varietà", labels=c("ab", "aB", "Ab", "AB"), values=c("#BE2A1E", "#EC654A", "#EACE65", "#3C8D43")) 
#

semplicemente sostituendo la funzione scale_fill_discrete() con la funzione scale_fill_manual() e specificando i quattro colori con l'argomento values e il vettore c() che ne contiene i codici esadecimali.


Conclusione: oltre che con le funzioni del pacchetto base di R [3] i grafici a torta possono essere realizzati anche con il pacchetto ggplot2 nel quale sono una semplice trasformazione in coordinate polari dei grafici a barre. Anche se i grafici a torta non sono consigliati [4] è forse possibile impiegarli, con l'accortezza di riportare sempre anche i valori numerici corrispondenti, in casi, come quello qui esaminato, nei quali le differenze numeriche tra i singoli elementi sono tali da riuscire difficilmente ingannevoli.


----------

[1] Bossi A, Cortinovis I, Duca PG, Marubini E. Introduzione alla statistica medica. La Nuova Italia Scientifica, Roma, 1994, ISBN 88-430-0284-8, pp. 293-295.
 

[3] Vedere il post Grafici a torta (pie chart).

[4] "Percentages ... can also be expressed using a pie-chart, but since the human eye is very poor at comparing angles, we do not recommend these for display purposes". Campbell MJ, Machin D. Medical Statistics. A Commonsense Approach. John Wiley & Sons, New York, 1993, ISBN 0-471-93764-9, p. 54.


Nessun commento:

Posta un commento