Visualizzazione post con etichetta grafici a torta. Mostra tutti i post
Visualizzazione post con etichetta grafici a torta. Mostra tutti i post

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.


domenica 9 dicembre 2018

Grafici a torta (pie chart)

Per la rappresentazione grafica di dati qualitativi il metodo più generico, ma anche il più limitato, in quanto adatto essenzialmente alla rappresentazione dei rapporti percentuali, è rappresentato dai grafici a torta o pie chart. A causa del fatto che l'occhio umano ha una scarsa capacità nella valutazione degli angoli i grafici a torta non sono raccomandati per la rappresentazione di dati scientifici [1]. Nonostante questo anche in R sono disponibili strumenti grafici per la realizzazione dei grafici a torta.

Nell'esempio, tratto da Marubini [2], il numero di individui prodotti per ciascuna delle varietà AB, Ab, aB, ab in un esperimento di ibridazione di specie vegetali era:

AB
Ab
aB
ab
72
29
36
12

Con questo script viene generato un grafico a torta con i valori originali trasformati in percentuale e con una legenda esterna. Copiatelo e incollatelo nella Console di R e premete Invio:

# GRAFICO A TORTA
#
val <- c(72, 29, 36, 12) # valori
eti <- c("AB","Ab","aB","ab") # etichette
percent <- round(100*val/sum(val), 1) # percentuale per ciascun valore
#
windows() # apre una nuova finestra
pie(val, labels = percent, main = "Individui prodotti per ciascuna varietà", col = rainbow(length(val))) # grafico a torta con percentuali e legenda esterna
legend("topright", eti, cex = 0.8, fill = rainbow(length(val))) # riporta la legenda
#

Con le prime tre righe di codice sono generati:
→ l'array val che contiene i valori corrispondenti alle quattro “fette” della torta;
→ l'array eti che contiene le etichette/descrizioni associate alle “fette”;
→ l'array percent che contiene i valori dell'array val trasformati in percentuale (ciascun valore val viene diviso per la somma totale dei valori sum(val) e moltiplicato per 100 (100*), quindi il risultato viene arrotondato a un decimale con l'argomento , 1 e viene infine salvato (<- ) nell'array percent).

Dopo avere aperto alla quarta riga una nuova finestra grafica con la funzione windows(), alla quinta riga la funzione pie() traccia un grafico a torta impiegando i seguenti argomenti:
→ i valori val da rappresentare;
→ le relative etichette label con i valori percentuali percent calcolati in precedenza;
→ il titolo del grafico main;
→ il colore col che viene cambiato a ciascuna “fetta” con la funzione rainbow() e impiegando tanti colori quante sono le fette con la funzione lenght(val).

Infine viene riportata la legenda con la funzione legend() che prevede i seguenti argomenti:
"topright" per la posizione in alto a destra;
eti per le etichette da impiegare;
cex = 0.8 per le dimensioni;
fill per i colori che riprendono ovviamente quelli definiti nella funzione pie().


Oltre ai grafici a torta tradizionali è possibile generare grafici a torta 3D mediante un pacchetto aggiuntivo, il pacchetto plotrix, che deve essere scaricato dal CRAN.

In quest'altro script le novità rispetto al precedente sono:
→ l'impiego del pacchetto plotrix;
→ la funzione pie3D() in sostituzione della funzione pie();
→ l'argomento explode=0.1 che consente di variare quanto le fette sono distanziate l'una dall'altra (è possibile scegliere non solo valori superiori ma anche valori inferiori a 0.1);
→ l'argomento bty="n" che consente di eliminare il riquadro delle didascalie che era presente nella figura precedente.

Se non l'avete già fatto, prima di eseguire lo script dovete scaricare e installare il pacchetto plotrixCopiate lo script, incollatelo nella Console di R e premete ↵ Invio:

# GRAFICO A TORTA 3D
#
library(plotrix) # carica il pacchetto
#
val <- c(72, 29, 36, 12) # valori
eti <- c("AB","Ab","aB","ab") # etichette
percent <- round(100*val/sum(val), 1) # percentuale per ciascun valore
#
windows() # apre una nuova finestra
pie3D(val, labels = percent, explode = 0.1, main = "Individui prodotti per ciascuna varietà", col = rainbow(length(val))) # grafico a torta 3D con percentuali e legenda esterna
legend("topright", eti, cex = 0.8, fill = rainbow(length(val)), bty="n") # riporta la legenda
#



Nota bene:  oltre che con le funzioni qui illustrate, che sono incluse nell'installazione base di R, e che comunque forniscono rappresentazioni grafiche adeguate, i grafici a torta possono essere realizzati anche impiegando il pacchetto plotly [3] e il pacchetto ggplot2 [4] [5].


----------

[1] "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.


[3] Vedere: Pie Charts in R. How to make pie charts in R using plotly.
https://plotly.com/r/pie-charts/#basic-pie-chart

[4] Vedere: ggplot2 pie chart.
https://www.sthda.com/english/wiki/ggplot2-pie-chart-quick-start-guide-r-software-and-data-visualization