Indice
Grafici a barre multiple
I grafici a barre possono essere utili per confrontare l'andamento di più variabili. Per crearli con ggplot2, bisogna però organizzare la tabella dei dati in maniera appropriata. I dati dell'esempio sono tratti dal pacchetto Likert.
Dati e pacchetti
Per i dati:
install.packages("likert") library(likert) data(pisaitems)
Carichiamo i pacchetti del tidyverse.
library(tidyverse)
Organizzazione della tabella
Immaginiamo di avere un dataframe così organizzato:
df <- pisaitems %>% # seleziono alcune variabili select(ST24Q01, ST24Q02, ST24Q03, ST24Q04) head(df)
## ST24Q01 ST24Q02 ST24Q03 ST24Q04 ## 68038 Disagree Strongly agree Strongly agree Strongly disagree ## 68039 Agree Strongly disagree Strongly disagree Strongly agree ## 68040 Strongly agree Strongly disagree Strongly disagree Agree ## 68041 Disagree Disagree Agree Strongly disagree ## 68042 Strongly disagree Disagree Strongly disagree Disagree ## 68043 Agree Strongly disagree Strongly disagree Agree
Per fare un grafico a barre multiple dobbiamo prima fare una tabella di sintesi, per avere le frequenze (che rappresenteranno l'altezza delle barre):
apply(df, 2, table) %>% # ggplot lavora con dataframe e tibbles as_tibble(rownames = 'risposta')
## # A tibble: 4 x 5 ## risposta ST24Q01 ST24Q02 ST24Q03 ST24Q04 ## <chr> <int> <int> <int> <int> ## 1 Agree 20000 20935 23525 17358 ## 2 Disagree 23515 23811 22072 26449 ## 3 Strongly agree 7029 7487 5917 5330 ## 4 Strongly disagree 14947 13323 13900 16343
La trasformeremo poi, con pivot_longer()
, in modo che tutte le informazioni siano organizzate in colonna (vedi tidyr_pivot:
# dati in tabella riassuntiva, come sopra df.long <- apply(df, 2, table) %>% as_tibble(rownames = 'risposta') %>% # formato lungo pivot_longer(!risposta, names_to='items') head(df.long)
## # A tibble: 6 x 3 ## risposta items value ## <chr> <chr> <int> ## 1 Agree ST24Q01 20000 ## 2 Agree ST24Q02 20935 ## 3 Agree ST24Q03 23525 ## 4 Agree ST24Q04 17358 ## 5 Disagree ST24Q01 23515 ## 6 Disagree ST24Q02 23811
(Come si nota, le modalità della variabile “risposta” sono in ordine alfabetico, e non in quello della scala: ai fini dell'esampio non appare però necessario intervenire ulteriormente sui dati).
I grafici
A questo punto è possibile fare grafici a barre di sintesi in vari modi, come grafici a barre raggruppate:
df.long %>% ggplot(aes(x = risposta, y = value, fill = items)) + geom_col(position = position_dodge())
df.long %>% ggplot(aes(x = items, y = value, fill = risposta)) + geom_col(position = position_dodge()) + ylab(NULL)
\
Migliorare il grafico
- graf_barre_temi.R
# altre palette di colori library(RColorBrewer) df.long %>% # trasformiamo la variabile "risposta" in ordinale mutate(risposta = factor(risposta, levels = c("Strongly disagree", "Disagree", "Agree", "Strongly agree"), ordered = T)) %>% ggplot(aes(x = risposta, y = value, fill = items)) + geom_col(position = position_dodge(), # aggiungiamo un bordo alle barre col = 'darkgrey') + # cambiamo il tema theme_minimal() + # cambiamo i colori scale_fill_brewer(palette = "Set3") + labs(y = NULL, x = NULL)
Vedi
Script di esempio
E' possibile scaricare ed eseguire lo script dell'esempio:
- barre_multiple_ggplot2.R
library(tidyverse) # dati install.packages("likert") library(likert) data(pisaitems) df <- pisaitems %>% select(ST24Q01, ST24Q02, ST24Q03, ST24Q04) # tabella in formato lungo df.long <- apply(df, 2, table) %>% as_tibble(rownames = 'risposta') %>% pivot_longer(!risposta, names_to='items') # grafici df.long %>% ggplot(aes(x = risposta, y = value, fill = items)) + geom_col(position = position_dodge()) df.long %>% ggplot(aes(x = items, y = value, fill = risposta)) + geom_col(position = position_dodge()) + ylab(NULL)