Questa è una vecchia versione del documento!
Indice
Grafici a torta (ggplot)
Con dati individuali (dataset)
ggplot2 non ha i grafici a torta, che altro non sono che grafici a barre rappresentate in un sistema di coordinate polari. Partiamo dal grafico a barre illustrato qui:
farms %>% ggplot(aes(x = factor(1), fill = Manag)) + geom_bar(width = 0.4) + theme_minimal()
Aggiungiamo le coordinate polari, e il tema vuoto (non servono gli assi e le etichette degli assi). Di default, le modalità vanno in senso anti-orario: quindi, per migliorare la leggibilità del grafico, usiamo l'argomento direction = -1
:
- ggplot_piechart.R
farms %>% ggplot(aes(x = factor(1), fill = Manag)) + geom_bar() + # grafico a barre coord_polar(theta = "y", # variabile rappresentata direction = -1) + # senso antiorario theme_void()

Con tabelle di frequenza o dati aggregati
Se abbiamo invece una tabella di frequenza, o una tabella riassuntiva di valori, come nel caso illustrato qui, per ottenere il grafico in Fig. 1, scriveremo:
- ggplot_piechart2.R
# tabella di esempio tab1 <- as.data.frame(table(farms$Manag)) # come dataframe colnames(tab1) <- c("Manag", "Freq") # nomi delle colonne # grafico a torta tab1 %>% ggplot(aes(x = factor(1), y = Freq, # indichiamo i valori fill = Manag)) + geom_col() + coord_polar(theta = "y", direction = -1) + theme_void()
Etichette dei valori
Per aggiungere le etichette dei valori a grafici, possiamo utilizzare geom_text e geom_label
, o annotate
(testo libero). In questo caso, come nel caso dei grafici a barre sovrapposte, il principale problema è rappresentato dalla coordinate delle etichette.
Con geom_text e geom_label
Quando si parte da una tabella di frequenza, è possibile procedere come segue:
tab1 <- as.data.frame(table(farms$Manag)) # tabella come sopra colnames(tab1) <- c("Manag", "Freq")
I grafici a barre sovrapposte dispongono le modalità dall'alto verso il basso, rispetto a come sono disposte nella tabella. Per definire le coordinate, invertiamo l'ordine dei valori, e utilizziamo le frequenze cumulate:
rt <- rev(tab1$Freq) # invertiamo le frequenze pos <- cumsum(rt) - rt/2 # coordinate (y)
Inseriamo con geom_text
le etichette dei valori:
tab1 %>% ggplot(aes(x = factor(1), y = Freq, fill = Manag)) + geom_col() + coord_polar(theta = "y", direction = -1) + theme_void() + # geom_text geom_text(aes(label = rev(Freq)), # invertiamo le etichette x = 1, y = pos) # pos rm(tab1, pos, rt)

Modificando il valore di x, possiamo spostare le etichette all'esterno; aggiungiamo in questo caso i valori percentuali, e utilizziamo geom_label
:
- ggplot_piechart_label.R
tab1 <- as.data.frame(table(farms$Manag)) colnames(tab1) <- c("Manag", "Freq") rt <- rev(tab1$Freq) pos <- cumsum(rt) - rt/2 lbs <- paste(percent(rt), "%", sep ="") # etichette tab1 %>% ggplot(aes(x = factor(1), y = Freq, fill = Manag)) + geom_col() + coord_polar(theta = "y", direction = -1) + theme_void() + # geom_label geom_label(x = 1.6, # etichette all'esterno y = pos, aes(label = lbs), fill = "lightyellow", size = 3) rm(tab1, pos, rt, lbs)

Con annotate
Quando si voglia creare il grafico a partire dalle variabili del dataset, è più semplice utilizzare annotate()
, in quanto il numero dei casi (in questo esempio, 20) non corrisponde al numero delle etichette (4).
Questo è il codice per il grafico a torta in Fig. 2:
- ggplot_piechart_annotate.R
tab <- rev(table(farms$Manag)) pos <- as.numeric(cumsum(tab) - tab/2) farms %>% ggplot(aes(x = factor(1), fill = Manag)) + geom_bar() + annotate("text", x = 1, y = pos, label = tab) + coord_polar("y", direction = -1) + theme_void() rm(tab, pos)
Questo è il codice per il grafico in Fig. 3:
- ggplot_piechart_annotate2.R
tab <- rev(table(farms$Manag)) pos <- as.numeric(cumsum(tab) - tab/2) lbs <- paste(percent(table(farms$Manag)), "%", sep ="") farms %>% ggplot(aes(x = factor(1), fill = Manag)) + geom_bar() + annotate("label", x = 1.6, y = pos, label = lbs, fill = "lightyellow", size = 3) + coord_polar("y", direction = -1) + theme_void() rm(tab, pos, lbs)