domenica 7 febbraio 2021

Grafici a violino (violin plot)

I grafici a violino (violin plot) prendono lo spunto dai grafici a scatola con i baffi (boxplot) riportando per una distribuzione univariata, al posto delle classiche scatole, il profilo di densità dei valori osservati sotto forma di kernel density plot [1].

La forma tipica dei grafici, che dà loro il nome, deriva dal fatto che il kernel density plot dei dati è riportato simmetricamente da entrambi i lati della distribuzione. Mentre interessante, come vedremo tra poco, è che a un violin plot possono essere sovrapposti al bisogno un grafico a scatola con i baffi (boxplot) [2] oppure un grafico a punti (dotplot) [3], a testimonianza del fatto che si tratta di viste dei dati diverse ma tra loro integrate e complementari.

Come dati impieghiamo la concentrazione degli eritrociti (globuli rossi) nel sangue rilevata in 202 atleti australiani riportata nella colonna/variabile rcc della tabella ais inclusa nel pacchetto DAAG. Accertatevi di avere installato il pacchetto o in alternativa procedete come indicato in [4]. Se non volete installare il pacchetto e avete scaricato il file di dati ais.csv sostituite nella prima riga dello script

library(DAAG) 

con

ais <- read.table("c:/Rdati/ais.csv", header=TRUE, sep=";", dec=",") 

Dovete scaricare dal CRAN anche il pacchetto ggplot2 che realizza la grafica [5]. 

Il tema è stato suddiviso in sei script, corrispondenti ad altrettanti modi di rappresentazione, tra i quali scegliere quello preferito. Copiate questo primo script, incollatelo nella Console di R e premete ↵ Invio.


# GRAFICI A VIOLINO (VIOLIN PLOT)
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
windows() # apre una nuova finestra
#
# violin plot riportati per intero
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=FALSE)
#

La seconda riga di codice con library(ggplot2) carica il pacchetto che contiene le funzioni necessarie per realizzare i grafici a violino (violin plot).

Dopo (terza riga) avere aperto e inizializzato con la funzione windows() una nuova finestra grafica, arriviamo finalmente all'unica riga di codice necessaria per realizzare il nostro primo grafico a violino mediante due funzioni concatenate:
la funzione ggplot() che specifica come primo argomento i dati da impiegare (ais) e come secondo argomento impiega la funzione aes() per realizzare il grafico per la variabile eritrociti (y=rcc) separatamente per ciascuno sport praticato (x=sport), riempiendo i grafici con un colore differente per ciascuno sport (fill=sport);
la funzione geom_violin che realizza il grafico riportando per intero il kernel density plot calcolato sui dati.

Questo è quindi il primo grafico:

Minimizzate la finestra ma non chiudetela: vi sarà utile riaprirla per confrontare questo primo grafico con il secondo e con i successivi grafici.

Ora copiate e incollate nella Console di R il secondo script e premete ↵ Invio.

# GRAFICI A VIOLINO (VIOLIN PLOT)
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
windows() # apre una nuova finestra
#
# violin plot troncati ai valori minimo e massimo osservati
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE)
#

Ponendo nella funzione geom_violin() l'argomento trim=TRUE il kernel density plot/violin plot viene ora troncato in corrispondenza del valore minimo e del valore massimo osservati, o se preferite viene tracciato solamente all'interno del range/intervallo dei valori osservati.

Questo corrisponde ad una regola aurea in quanto in statistica (ma non solo in statistica) effettuare una estrapolazione, ovvero andare oltre i dati, quindi andare al di la dell'informazione in nostro possesso, significa addentrarsi in un terreno molto scivoloso.

Ed ecco il secondo grafico:



Ora copiate e incollate nella Console di R questo terzo script e premete ↵ Invio.


# GRAFICI A VIOLINO (VIOLIN PLOT)
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
windows() # apre una nuova finestra
#
# violin plot con sovrapposto grafico a scatola con i baffi
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE) + geom_boxplot(width=0.1, fill="white")
#


Qui è stata aggiunta la funzione geom_boxplot() che sovrappone al grafico a violino/violin plot un grafico a scatola con i baffi (boxplot) specificando di rappresentare le scatole dei grafici:
→ con width="0.1" che definisce la larghezza delle scatole/box;
→ con fill="white" che specifica il colore di riempimento delle scatole/box.

Da notare che sono stati impiegati gli stessi dati utilizzati nell'esempio che illustra i grafici a scatola con i baffi [2] proprio per consentirvi di effettuare un immediato confronto tra le due rappresentazioni grafiche.

Questo è il terzo grafico realizzato:


Copiate e incollate nella
Console di R il quarto script e premete ↵ Invio.

# GRAFICI A VIOLINO (VIOLIN PLOT)
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
windows() # apre una nuova finestra
#
# violin plot senza legenda 
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE) + geom_boxplot(width=0.1, fill="white") + theme(legend.position="none")
#

Questa volta aggiungendo theme(legend.position="none") abbiamo tolto, in quanto ridondante, la legenda generata automaticamente che compariva sulla destra.

Questo è conseguentemente il quarto grafico:


Copiate e incollate nella Console di R questo quinto script e premete ↵ Invio.

# GRAFICI A VIOLINO (VIOLIN PLOT)
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
windows() # apre una nuova finestra
#
# violin plot con titolo ed etichette degli assi 
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE) + geom_boxplot(width=0.1, fill="white") + theme(legend.position="none") + labs(title="Concentrazione degli eritrociti per sport praticato", x="Sport", y = "Concentrazione degli eritrociti (10^12/L)")
#

Ogni grafico che si rispetti prevede un titolo e la descrizione della variabili rappresentate, cosa che viene qui realizzata con la funzione labs() nella quale sono specificati titolo (title=...), etichetta dell'asse delle x (x=...) ed etichetta dell'asse delle y (y=...).

Questo è il relativo e quinto grafico:


Per l'ultimo script c
opiate e incollate nella Console di R il codice che segue e premete ↵ Invio.

# GRAFICI A VIOLINO (VIOLIN PLOT)
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
windows() # apre una nuova finestra
#
# violin plot con sovrapposto il grafico a punti 
ggplot(ais, aes(x=sport, y=hg, fill=sport)) + geom_violin(trim=TRUE) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=0.7, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(10,20)) + theme(legend.position="none") + labs(title="Concentrazione dell'emoglobina nel sangue per sport praticato", x="Sport praticato", y="Emoglobina (g/dL)")
#

Qui è stata aggiunta la funzione geom_dotplot() che sovrappone al grafico a violino/violin plot un grafico a punti (dotplot). Inoltre i dati sono cambiati: abbiamo riportato, per ciascuno sport praticato, la concentrazione dell'emoglobina, la stessa impiegata per realizzare i grafici a punti [3], per consentirvi di effettuare un immediato confronto tra le due rappresentazioni grafiche.

Infine è stata aggiunta la funzione coord_cartesian() mediante la quale sono fissati con l'argomento ylim=... il limite inferiore (10) e il limite superiore (20) entro i quali rappresentare i valori.

E questo è quindi il sesto e ultimo grafico:


Potete facilmente adattare il codice per ottenere la rappresentazione che più vi interessa, aiutandovi con la documentazione del pacchetto [5]:
→ sostituendo la prima riga con il codice necessario per importare i vostri dati;
→ nella funzione ggplot() sostituendo ais con il nome dell'oggetto che contiene i vostri dati;
→ riportando in x=... il nome del fattore cioè della variabile qualitativa con la quale aggregare i dati in sottoinsiemi e in y=... il nome della vostra variabile numerica;
→ adattando opportunamente nella funzione labs() il titolo, il nome del fattore e il nome della variabile.

Per una guida rapida all'importazione in R dei vostri dati potete consultare i link:
importazione dei dati da un file .xls o .xlsx
importazione dei dati da un file .csv

Infine si rammenta che nel post Salvare i grafici di R in un file è riportato uno script che consente di trasformare i grafici in immagini e salvarli sotto forma di file .bmp, .jpeg, .png, .pdf, .ps per poterli stampare, archiviare, inserire in una pubblicazione, in un post o in un sito web.

-----------


[1] Per i dettagli vedere il post Kernel density plot.


[3] Vedere il post Grafici a punti (dotplot).

[4] Potete scaricare questo e gli altri file di dati seguendo le indicazioni che trovate alla pagina Dati.

[5] Il manuale di riferimento Package ‘ggplot2’ lo potete scaricare facendo click sul link accanto alla voce Reference manual nella pagina di documentazione del pacchetto. URL consultato il 7/02/2021: https://bit.ly/3ioEJfE