lunedì 10 dicembre 2018

Grafici a barre (barplot) [2]

Dopo la prima parte dedicata ai grafici a barre (bar plot o barplot[1] continuiamo ora estendendo la rappresentazione a un numero maggiore di dati con l'esempio tratto da Marubini [2] relativo al grado di protezione rilevato per cinque differenti vaccini contro l'influenza. Questi sono i dati espressi in percentuale:

Esito
Vaccino_1
Vaccino_2
Vaccino_3
Vaccino_4
Vaccino_5
Influenza_si
18.1
21.0
9.1
18.3
20.0
Influenza_no
81.9
79.0
90.8
81.7
80.0

Questo script permette di generare un classico grafico a barre affiancate. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICO A BARRE PER L'EFFICACIA DI 5 VACCINI
#
cells <- c(18.1,21,9.1,18.3,20,81.9,79,90.9,81.7,80) # genera l'array cells con i valori di percentuale
rnames <- c("Influenza_si", "Influenza_no") # genera l'array rnames con i nomi delle righe
cnames <- c("Vaccino_1", "Vaccino_2", "Vaccino_3", "Vaccino_4", "Vaccino_5") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=5, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dati
#
mydata # mostra la matrice dati
t(mydata) # mostra la matrice dati trasposta
#
windows() # apre una nuova finestra
barplot(t(mydata), beside=TRUE, legend=TRUE, ylim=c(0,150), col=c("red","orange", "yellow", "green", "skyblue"), ylab="Frequenze osservate", xlab="Esiti delle vaccinazioni", main="Valutazione dell’efficacia di 5 vaccini influenzali") # traccia il grafico a barre verticali
#

Lo script segue lo schema già visto, nelle prime tre righe sono generati con la funzione c():
il vettore che contiene i dieci dati (che come si vede devono essere inseriti in sequenza leggendoli dalla tabella da sinistra a destra e dall'alto in basso) che sono salvati nell'oggetto cells;
il vettore che contiene i nomi delle righe, salvato nell'oggetto rnames;
il vettore che contiene i nomi delle colonne, salvato nell'oggetto cnames.

I tre vettori sono combinati a formare la matrice dei dati mediante la funzione matrix() che impiega gli argomenti che indicano:
l'oggetto/vettore contenente i dati (cells);
il numero di righe (nrow) e il numero di colonne (ncol) della matrice;
la modalità di riempimento della matrice, che deve essere riempita per righe (byrow=TRUE) quindi da sinistra a destra e dall'alto in basso;
i nomi da assegnare alle righe e alle colonne (dimnames=list(rnames, cnames)).

A questo punto per fare il punto della situazione sono mostrate sia la matrice dati mydata sia la sua matrice trasposta t(mydata) [3]:

> mydata # mostra la matrice dati 
             Vaccino_1 Vaccino_2 Vaccino_3 Vaccino_4 Vaccino_5
Influenza_si      18.1        21       9.1      18.3        20
Influenza_no      81.9        79      90.9      81.7        80
> t(mydata) # mostra la matrice dati trasposta 
          Influenza_si Influenza_no
Vaccino_1         18.1         81.9
Vaccino_2         21.0         79.0
Vaccino_3          9.1         90.9
Vaccino_4         18.3         81.7
Vaccino_5         20.0         80.0

Viene quindi aperta una nuova finestra con la funzione windows() e viene generato un primo grafico a barre con la funzione barplot() [4] impiegando questi argomenti:
per i dati viene impiegata la matrice dati trasposta t(mydata);
l'argomento beside=TRUE specifica che le barre sono affiancate e non sovrapposte in pila;
con l'argomento legend=TRUE viene generata una legenda;
con l'argomento ylim=c(0,150) sono impostati il valore minimo e il valore massimo per l'asse delle y;
→ con l'argomento col è impostato il colore delle barre.


Ora copiate e incollate nella Console di R queste due righe di codice e premete ↵ Invio:

#
windows() # apre una nuova finestra
barplot(mydata, beside=FALSE, legend=TRUE, ylim=c(0,150), col=c("red", "green"), density = 40, angle = 45, ylab="Frequenze osservate", xlab="Vaccino infuenzale", main="Valutazione dell’efficacia di 5 vaccini influenzali") # traccia il grafico a barre verticali
#

Con lo script dopo avere aperto una nuova finestra grafica (windows()) viene realizzato un nuovo grafico a barre impiegando la funzione barplot() con queste variazioni rispetto al precedente:
per i dati viene impiegata la matrice mydata;
l'argomento beside=FALSE specifica che le barre sono sovrapposte in pila;
con l'argomento col=c("yellow", "green") viene fornito l'array contenente i colori da applicare;
→ con gli argomenti density = 40, angle = 45 sono specificati la densità e l'angolo delle linee colorate che andranno a riempire le barre.

Il risultato è ora questo grafico con le barre sovrapposte in pila (attenzione al fatto che ogni nuova finestra grafica si sovrappone alla precedente, spostatela per visualizzarle entrambe):


Finora i grafici a barre sono stati generati specificando per ciascuna barra il numero dei casi. Ma se i dati sono numerosi è possibile impiegare la funzione table() che genera tabelle di contingenza che riportano i dati dei conteggi effettuati per noi da R [5].

Per farlo è necessario il pacchetto DAAG [6]. Il pacchetto contiene tra gli altri il set di dati ais sul quale effettuiamo il conteggio e la rappresentazione sotto forma di grafico a barre prima del numero degli atleti per sport praticato e poi del numero degli atleti per sesso e per sport praticato.

Ora copiate e incollate nella Console di R queste righe di codice e premete ↵ Invio:

# GRAFICI A BARRE DA UNA TABELLA DI CONTINGENZA
#
library(DAAG) # carica il pacchetto e il set di dati ais
#
# grafico a barre per sport praticato
#
tab <- table(ais$sport) # tabula i dati per sport
windows() # apre una nuova finestra
barplot(t(tab), beside=TRUE, legend=TRUE, cex.names = 0.8, las = 2, xlab= "Sport praticato", ylab = "Numero degli atleti", main = "Numero degli atleti per sport praticato", col = "green") # grafico a barre
#
# grafico a barre per sport praticato e per sesso
#
tab <- table(ais$sport, ais$sex) # tabula i dati per sport e per sesso
windows() # apre una nuova finestra
barplot(t(tab), beside=TRUE, legend=TRUE, cex.names = 0.8, las = 2, xlab= "Sport praticato", ylab = "Numero degli atleti", main = "Numero degli atleti per sport praticato e per sesso", col = c("green", "yellow")) # grafico a barre
#

Questo è il grafico a barre con il numero degli atleti per sport praticato


e questo è il grafico a barre con il numero degli atleti per sport praticato ulteriormente suddiviso per sesso dell'atleta


In entrambi i casi viene impiegata la matrice trasposta t(tab) ma le cose più interessanti sono:
→ l'espressione table(ais$sport) impiegata per tabulare i dati in base alla variabile sport (lo sport praticato dall'atleta);
→ l'espressione table(ais$sport, ais$sex) impiegata per tabulare i dati in base alla variabile sport e suddividerli ulteriormente in base alla variabile sex (il sesso dell'atleta);
→ l'argomento cex.names = 0.8 che rimpicciolisce le etichette che riportano lo sport corrispondente a ciascuna della barre;
→ l'argomento las = 2 che le ruota verticalmente.


----------

[1] Vedere il post Grafici a barre (barplot) [1].


[3] Digitate help(t) nella Console di R per la documentazione della funzione t().

[4] Digitate help(barplot) nella Console di R per la documentazione della funzione barplot().

[5] Digitate help(table) nella Console di R per la documentazione della funzione table().

[6] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati della tabella senza installare il pacchetto DAAG

2 commenti:

  1. Grazie molto utile:) hai anche qualche script dove spieghi come graficare le barre di errore per ogni bar plot?

    RispondiElimina
  2. Ti consiglio il pacchetto ggplot2, guarda qui...

    https://www.r-graph-gallery.com/4-barplot-with-error-bar.html

    RispondiElimina