mercoledì 25 novembre 2020

Grafici a punti (dotplot)

I grafici a punti (dotplot) rappresentano una interessante alternativa ai grafici a scatola con i baffi (boxplot) [1] nei casi di distribuzioni univariate che includono pochi dati e per le quali non volete perdere il dettaglio dei singoli valori. 

Possono inoltre essere sovrapposti sia ai boxplot sia ai grafici a violino (violin plot) [2] a testimonianza del fatto che si tratta di viste dei dati diverse ma tra loro integrate.

Per eseguire i due script che seguono è necessario scaricare dal CRAN il pacchetto ggplot2 [3] e il pacchetto gridExtra [4]. Accertatevi inoltre di avere già installato il pacchetto DAAG che contiene i dati impiegati nello script, o in alternativa procedete seguendo le indicazioni riportate in [5].

Copiate questo primo script, incollatelo nella Console di R e premete ↵ Invio.

# UN GRAFICO A PUNTI (DOTPLOT)
#
library(DAAG) # carica il pacchetto DAAG che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
#
ggplot(ais, aes(x=sport, y=hg, fill=sport)) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=1, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(10, 20)) + labs(title="Concentrazione dell'emoglobina nel sangue per sport praticato", x="Sport praticato", y="Emoglobina (g/dL)") + theme_classic() # traccia dotplot dell'emoglobina per sport
#


Dopo avere caricato i pacchetti necessari, il grafico a punti (dotplot) viene realizzato impiegando una sola riga di codice che include cinque funzioni concatenate:
la funzione ggplot() che specifica i dati da impiegare (ais) e con la funzione aes() specifica di realizzare il grafico a punti separatamente per ciascuno sport praticato (x=sport) per la variabile emoglobina (y=hg);
la funzione geom_dotplot() che di fatto realizza il grafico con una serie piuttosto articolata di argomenti per il dettaglio dei quali rimando alla documentazione della funzione inclusa nel manuale di riferimento del pacchetto [3];
la funzione coord_cartesian() che viene impiegata per stabilire (ylim=) valore minimo e valore massimo pare rappresentare la distribuzione dei punti sull'asse delle y;
la funzione labs() che banalmente riporta titolo ed etichette degli assi;
la funzione theme_classic() che definisce "il look" del grafico.

In generale per realizzare un grafico a punti (dotplot) è necessario avere una variabile numerica [valore] che contiene i valori osservati più una seconda variabile qualitativa che contiene un criterio di classificazione [fattore] per aggregare i valori in sottoinsiemi, come qui schematicamente esemplificato

  valore  fattore
     4        A   
  2        B
  5        B
  4        A
  3        C
  5        A
  2        C
  7        B
  ...      ...

e dove nel caso specifico il valore è la concentrazione di emoglobina contenuta nella variabile hg (riportata sull'asse verticale y) e il fattore è lo sport praticato contenuto nella variabile sport (riportata sull'asse orizzontale x).

Se guardate alla struttura dell'oggetto ais digitando

str(ais)


notate che i dati impiegati per realizzare il grafico a punti sono strutturati proprio in questo modo. 

E questo è il grafico ottenuto con lo script.


Ora copiate e incollate nella Console di R queste due altre righe di codice che aprono una nuova finestra grafica nella quale viene rappresentato lo stesso grafico, questa volta aggiungendo (+) al codice riportato in precedenza la funzione stat_summary() che sovrappone ai punti la media e l'intervallo corrispondente a due (mult=2) deviazioni standard:

#
windows() # apre e inizializza una nuova finestra grafica
ggplot(ais, aes(x=sport, y=hg, fill=sport)) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=1, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(10, 20)) + labs(title="Concentrazione dell'emoglobina nel sangue per sport praticato", x="Sport praticato", y="Emoglobina (g/dL)") + theme_classic() + stat_summary(fun.data=mean_sdl, fun.args = list(mult=2), geom="pointrange", color="black", show.legend=FALSE) # aggiunge media +/- 2 deviazioni standard
#


Questo è il grafico.


Copiate quest'altro script, incollatelo nella Console di R e premete ↵ Invio.

# DUE GRAFICI A PUNTI (DOTPLOT) AFFIANCATI
#

library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
#
plot1 <- ggplot(ais, aes(x=sex, y=hg, fill=sex)) + 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)) + labs(title="Emoglobina per sesso", x="Sesso", y="Emoglobina (g/dL)") + theme_classic() # dotplot dell'emoglobina per sesso
#
plot2 <- ggplot(ais, aes(x=sex, y=hc, fill=sex)) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=1, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(35, 50)) + labs(title="Ematòcrito per sesso", x="Sesso", y="Ematòcrito (%)") + theme_classic() # dotplot dell'ematòcrito per sesso
#
library(gridExtra) # carica il pacchetto con la funzione necessaria per realizzare i grafici affiancati
grid.arrange(plot1, plot2, nrow = 1) # i due grafici sono affiancati orizzontalmente
#


Il codice di fatto è sempre lo stesso tranne che per due aspetti:
→ sono realizzati due grafici a punti - per la variabile hg e per la variabile hc [5] - separando i dati per sesso (x=sex);
→ per affiancare i due grafici, dell'emoglobina (hg) per sesso e dell'ematòcrito (hc) per sesso, viene impiegata la funzione grid.arrange() inclusa nel pacchetto gridExtra [3] che consente di superare i limiti della analoga funzione par(mfrow=...) del pacchetto base di R [6].

Questo è il risultato.


Per adattare gli script ai vostri dati dovete:
 sostituire la prima riga con il codice necessario per importare i vostri dati;
 nella funzione ggplot() sostituire ais con il nome dell'oggetto che contiene i vostri dati;
 nella funzione aes() sostituire in x il nome della variabile (sex) con quello della variabile (fattore) che volete impiegare per raggruppare i vostri valori in sottoinsiemi;
→ nella funzione aes() sostituire in y il nome della variabile (hg) con quello della variabile numerica che contiene i vostri valori;
→ nella funzione labs() adattare opportunamente titolo, nome del fattore e nome della variabile.

Ricordate infine che:
→ potete visualizzare il kernel density plot dei dati sovrapponendo ai grafici a punti i grafici a violino [2];
 potete salvare le immagini realizzate con R sotto forma di file .bmp, .jpeg, .png, .pdf, .ps per stamparle, archiviarle, inserirle in una pubblicazione, in un post o in un sito web, impiegando il codice riportato nel post Salvare i grafici di R in un file.

Se siete interessati a rappresentazioni grafiche più elaborate di quelle presenti nel pacchetto base di R potrebbe esservi utile approfondire le funzioni del pacchetto ggplot2 [3]. 


----------



[3] Il manuale di riferimento Package ‘ggplot2’ lo trovate facendo click sul link Reference manual nella pagina di documentazione del pacchetto. URL consultato il 2/10/2020: https://bit.ly/3ioEJfE

[4] Il manuale di riferimento Package ‘gridExtra’ lo trovate facendo click sul link Reference manual nella relativa pagina di documentazione del pacchetto. URL consultato il 2/10/2020: https://bit.ly/36qc9Ip

[5] Vedere il post Il set di dati ais e le indicazioni riportate alla pagina Dati.

[6] Alcuni esempi di impiego della funzione par(mfrow=...) sono riportati nel post Inserire più grafici nella stessa immagine.

Nessun commento:

Posta un commento