Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


Il Laboratorio di Analisi dei Dati con R, dell'Università di Teramo su piattaforma Meet, inizia il 9 aprile 2021 - Iscrizione - email
r:ggplot2:grafici_a_torta

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()
&nolink |

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()
&nolink |

Fig. 1: Grafico a torta semplice

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)
&nolink |

Fig. 2: Grafico a torta con etichette (text)

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)
&nolink |

Fig. 3: Grafico a torta con etichette (label)

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)
r/ggplot2/grafici_a_torta.txt · Ultima modifica: 26/09/2021 11:48 da admin