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_barre_multiple

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 in modo che tutte le informazioni siano organizzate in colonna, ovvero in formato lungo:

# 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())
&nolink |
df.long %>% 
  ggplot(aes(x = items, y = value, 
             fill = risposta)) +
  geom_col(position = position_dodge()) +
  ylab(NULL)
&nolink |

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

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)
r/ggplot2/grafici_a_barre_multiple.txt · Ultima modifica: 25/09/2021 13:38 da admin