Visualizzazione post con etichetta grafici di dispersione. Mostra tutti i post
Visualizzazione post con etichetta grafici di dispersione. Mostra tutti i post

15 marzo 2026

Grafici di dispersione (scatterplot) per fattore con ggplot

La statistica è l'arte sottile che consente di ricavare informazione dai dati. Vediamo come ciò sia possibile impiegando anche semplici grafici di dispersione ma in questo caso separati per fattore.

Il punto di partenza è un grafico xy della distribuzione dei valori di concentrazione nel sangue dei globuli rossi (in ascisse) e dell'emoglobina (in ordinate) misurati in 202 atleti australiani di entrambi i sessi che praticano dieci differenti sport e contenuti nel set di dati ais.
 
# SCATTERPLOT semplice con ggplot
#
library (DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto per la grafica
#
# scatterplot semplice
ggplot(ais, aes(x=rcc, y=hg, color=sport)) + geom_point()
#

Le prime due righe servono a caricare i due pacchetti necessari, che devono essere preventivamente scaricati dal CRAN, e il primo dei quali contiene il set di dati [1]. 

Per realizzare il grafico viene impiegata la funzione ggplot() che prevede come argomenti:
→ il nome della tabella che contiene i dati (ais);
→ la funzione aes() che specifica la variabile da riportare in ascisse (rcc) e la variabile da riportare in ordinate (hg), che sono rispettivamente la concentrazione degli eritrociti (o globuli rossi) nel sangue espressa in milioni per microlitro di sangue (10^6/µL) e la concentrazione di emoglobina espressa in grammi per decilitro di sangue (g/dL);
→ il colore dei punti (color) separato per ciascuno degli sport praticati e codificati nella variabile sport.

Alla funzione ggplot() viene quindi collegata con il segno più [+] la funzione geom_point() che realizza il grafico impiegando i valori previsti di default e individuando gli sport praticati con un colore.


Visto il grado di sovrapposizione dei dati, vogliamo provare a separarli generando dieci scatterplot, uno per ciascuno degli sport. Ecco lo script necessario e i grafici risultanti.
 
# SCATTERPLOT separati per fattore
#
library (DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto per la grafica
#
# scatterplot separati per il fattore sport
ggplot(ais, aes(x=rcc, y=hg, color=sport)) + geom_point() + facet_wrap(~sport) 
#


Quindi per scomporre i dati nei dieci sottoinsiemi rappresentativi di ciascuno sport è stato sufficiente, al codice necessario per realizzare il grafico di dispersione che riporta tutti i dati, aggiungere (+) la funzione facet_wrap() specificando che i dati devono essere suddivisi per sport (~sport).

Possiamo anche migliorare il grafico come segue.
 
# SCATTERPLOT riorganizzati per righe
#
library (DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto per la grafica
#
# scatterplot riorganizzati per righe
ggplot(ais, aes(x=rcc, y=hg, color=sport)) + geom_point(show.legend=FALSE) + facet_wrap(~sport, nrow=2) 
#

In questo caso:
→ visto che la rappresentazione fornita contiene già le etichette che individuano i dati, è stata eliminata la legenda (show.legend=FALSE);
→ i grafici sono stati riorganizzati su due righe con nrow=2, con questo risultato.


Dei nostri dati abbiamo quindi realizzato una grafica sintetica (primo script) e poi abbiamo visto come realizzare una grafica analitica: ma che dire se potessimo visualizzarle contemporaneamente entrambe? Ecco come è possibile farlo.
 
# SCATTERPLOT sovrapposti ai dati globali
#
library (DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto per la grafica
#
# scatterplot separati sovrapposti alla distribuzione globale dei dati
ggplot(ais, aes(x=rcc, y=hg, color=sport)) + geom_point(data=transform(ais, sport=NULL), colour="grey82") + geom_point(show.legend = FALSE) + facet_wrap(~sport, nrow=2, strip.position="bottom")
#


Nota: i grafici mettono in rilievo l'informazione che la distribuzione dei valori non è omogenea in tutti gli sport – ad esempio gli atleti che praticano lo sport Netball hanno concentrazioni di eritrociti ed emoglobina relativamente basse e all'estremo opposto di quelle relativamente alte che si riscontrano negli atleti che praticano pallanuoto (W_Polo).

In questo caso viene aggiunta una nuova funzione geom_point() che elimina dai dati la variabile sport (sport=NULL) mediante la funzione transform() per riportarli tutti nel grafico – in colore grigio (colour="grey82") – prima che ad essi con le successive funzioni  geom_point() e facet_wrap() siano sovrapposti separatamente i dati dei singoli sport. 

Da notare che la funzione facet_wrap() tra le altre cose:
→  consente con l'argomento strip.position di personalizzare la posizione delle etichette, con il valore predefinito "top", che può essere cambiato in "bottom" (come in questo caso), "left" o "right";
→  consente con l'argomento scales di specificare il tipo di scale impiegate, con il valore predefinito "fixed" che assume come in questo caso scale degli assi x e y uguali in tutti i grafici, e con i valori "free", "free_x" o "free_y" da impiegare qualora siano previste scale differenti degli assi.

Per completare l'analisi grafica dei dati la eseguiamo anche per il sesso degli atleti sostituendo sport con sex, il nome della variabile fattore che contiene l'indicazione del sesso dell'atleta [1].
 
# SCATTERPLOT sovrapposti ai dati globali
#
library (DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto per la grafica
#
# scatterplot separati sovrapposti alla distribuzione globale dei dati
ggplot(ais, aes(x=rcc, y=hg, color=sex)) + geom_point(data=transform(ais, sex=NULL), colour="grey82") + geom_point(show.legend=FALSE) + facet_wrap(~sex, nrow=2, strip.position="bottom")
#


In questo caso il grafico mette in evidenza che la distribuzione del valori non è omogenea nei due sessi, un fatto che rispecchia i differenti "valori normali" dei globuli rossi e dell'emoglobina nelle donne e negli uomini (valori che sono fisiologicamente mediamente inferiori nelle prime rispetto ai secondi).

Conclusione: opportunamente impiegati i grafici xy consentono di ricavare dai dati informazioni che vanno al di la della semplice relazione tra due variabili.


---------

[1] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati senza impiegare il pacchetto DAAG.

12 marzo 2019

Grafici di dispersione (scatterplot)

I grafici di dispersione (scatter plot o scatterplot) sono lo strumento base per visualizzare su un sistema di coordinate cartesiane le coppie di valori x,y di due variabili numeriche nel caso di distribuzioni bivariate.

Prendiamo come esempio i dati ematologici relativi agli eritrociti (o globuli rossi), la cui funzione essenziale come noto è trasportare l'ossigeno dai polmoni a tutti gli altri organi e tessuti, e per i quali valgono in media i seguenti dati (arrotondati per semplicità) :
→ gli eritrociti hanno una concentrazione nel sangue all'incirca di 5·1012/L (ovvero ve ne sono all'incirca cinquemila miliardi in un litro di sangue);
→ un eritrocito ha un volume all'incirca di 90 fL (un femtolitro corrisponde a 10-15 litri quindi un globulo rosso ha un volume all'incirca di 0.000 000 000 000 090 litri).

Da questi dati si ricava che la percentuale del volume del sangue occupata dagli eritrociti (detta valore ematòcrito, e uguale alla concentrazione degli eritrociti moltiplicata per il volume di un eritrocito) è il 45% (la restante parte, esclusi i globuli bianchi e le piastrine, che occupano un volume irrilevante, è liquida ed è rappresentata dal plasma). E si ricava anche che deve esistere una proporzionalità diretta tra il numero dei globuli rossi e il volume che occupano. Possiamo quindi dare un senso al prossimo script, che traccia il grafico di dispersione di queste due grandezze allo scopo di evidenziarne la relazione.

I dati sono contenuti nella tabella ais del pacchetto DAAG - accertatevi di avere installato il pacchetto o in alternativa procedete come indicato in [1].

Copiate lo script e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICI DI DISPERSIONE (scatterplot)
#
library(DAAG) # carica il pacchetto che include il set di dati ais
str(ais) # struttura di ais
attach(ais) # consente di impiegare direttamente i nomi delle variabili
#
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(2,2)) # predispone la suddivisione della finestra in quattro quadranti, uno per grafico
#
plot(rcc, hc, xlab="Eritrociti (10^12/L)", ylab="Ematòcrito (%)", main="Grafico di dispersione") # grafico di dispersione semplice
#
plot(rcc, hc, pch=2, col="goldenrod", xlab="Eritrociti (10^12/L)", ylab="Ematòcrito (%)", main="Cambia simbolo e colore") # cambia simbolo e colore
#
plot(rcc, hc, pch=1, col="black", abline(lm(hc~rcc), col="red", lty=1, lwd=1), xlab="Eritrociti (10^12/L)", ylab="Ematòcrito (%)", main="Retta di regressione") # grafico con retta di regressione
#
plot(rcc, hc, xlim=c(3,7), ylim=c(30,70), xaxp=c(3, 7, 4), yaxp=c(30, 70, 4), pch=20, col="black", abline(lm(hc~rcc), col="black", lty=1, lwd=1), xlab="Eritrociti (10^12/L)", ylab="Ematòcrito (%)", main="Ridimensiona gli assi") # ridimensiona gli assi
#
detach(ais) # termina l'impiego diretto dei nomi delle variabili 
#

Dopo avere caricato il pacchetto che include il set di dati ais e dopo averne mostrato la sua struttura con str(ais), viene impiegata la funzione attach(ais) al fine di consente, nelle funzioni successive, di impiegare direttamente i nomi delle variabili incluse nel set di dati.

Per semplificare la presentazione grafica, con par(mfrow=c(2,2)) la finestra viene suddivisa in quattro quadranti, uno per ciascuno dei grafici che verranno preparati.

Il primo grafico, in alto a sinistra, lascia per gli argomenti della funzione plot() i valori di default, specificando solamente quelli essenziali [2]:
→ rcc la variabile da riportare sull'asse delle ascisse x;
→ hc la variabile da riportare sull'asse delle ordinate y;
→ xlab="" l'etichetta da riportare per l'asse delle x;
→ ylab="" l'etichetta riportata per l'asse delle y;
→ main="" il titolo del grafico che compare in alto.

Nel secondo grafico, in alto a destra, sono aggiunti gli argomenti:
→ pch=2 che specifica per i dati l'impiego di un simbolo (triangolo) differente da quello di default (che è il cerchio) [3];
→ col="goldenrod" che specifica per il simbolo dei dati l'impiego di un colore diverso dal nero [4].

Nel terzo grafico, in basso a sinistra, viene riportata la retta di regressione mediante la funzione abline() che impiega come argomenti:
→ l'equazione della retta calcolata con la funzione lm() e gli argomenti hc~rcc che specificano rispettivamente la variabile in ordinate e la variabile in ascisse;
→ il colore della retta (col="red");
→ il tipo di linea da impiegare (lty=1), uno dei sei possibili con i valori da 1 a 6 [5];
→ lo spessore della linea (lwd=1) espresso come multiplo dello spessore di default (1 uguale spessore di default, 2 spessore doppio, eccetera).


Nel quarto grafico, in basso a destra, compaiono quattro nuovi argomenti, che illustrano come gestire in modo personalizzato le scale degli assi e la loro suddivisione:
→ xlim = c(3,7) indica limite inferiore e limite superiore della scala applicata all'asse delle ascisse, trattandosi di valori di concentrazione degli eritrociti espressi in 1012/L questo significa che l'asse delle ascisse riporterà i valori compresi tra 3·1012/L e 7·1012/L;
→ ylim = c(30,70) indica limite inferiore e limite superiore della scala applicata all'asse delle ordinate, che, trattandosi di valori di percentuale, varieranno quindi tra 30% e 70%;
→ xaxp = c(3, 7, 4) dice che sull'asse delle ascisse la scala che va da 3·1012/L a 7·1012/L deve essere suddivisa in quattro intervalli, quindi sull'asse delle ascisse compariranno cinque tacche con i valori 3, 4, 50, 6, 7;
→ yaxp = c(30,70,4) dice che sull'asse delle ordinate la scala che va da 30% e 70% deve essere suddivisa in quattro intervalli, quindi sull'asse delle ordinate compariranno cinque tacche con i valori 30, 40, 50, 60, 70.

Lo script si chiude con la funzione detach() che pone termine all'impiego diretto dei nomi delle variabili. In altre parole la variabile rcc ora diventa ais$rcc, la variabile hc ora diventa ais$hc e così via.

I grafici di dispersione riportati qui sopra sono interessanti in quanto sono stati realizzati impiegando esclusivamente le funzioni base di R, tuttavia si può fare esteticamente di meglio, come nell'esempio che segue, che per tracciare lo scatterplot impiega le funzioni del pacchetto ggplot2.

Copiate lo script e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICO DI DISPERSIONE con ggplot
# colori differenziati in base a un fattore
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(ggplot2) # carica il pacchetto per la grafica
#
windows() # apre e inizializza una nuova finestra grafica
ggplot(ais, aes(x=rcc, y=hc, color=sport)) + geom_point(size=4) + theme_minimal() # traccia il grafico
#

Ed ecco il grafico, nel quale è interessante notare come la funzione ggplot() consente di attribuire ai punti un differente colore (color=) sulla base dei valori assunti dal fattore sport, lo sport praticato: si ottiene in questo modo un grafico di dispersione con evidenziazione dei sottoinsiemi presenti nei dati. Altri esempi che illustrano le varie possibilità di realizzare scatterplot con ggplot2 sono riportati in un post al quale rimando [6].


Vediamo ora un grafico di dispersione multiplo che aiuta ad illustrare le relazioni tra le variabili riportando tutti i possibili grafici di dispersione singoli che risultano incrociando i dati ematologici contenuti nelle seguenti variabili del set di dati ais: rcc (eritrociti), wcc (leucociti), hc (ematòcrito), hg (emoglobina) e ferr (ferritina). 

I grafici sono realizzati mediante i pacchetti aggiuntivi car e gclus: se non l'avete già fatto, dovete scaricarli e installarli dal CRAN.

Copiate e incollate nella Console di R lo script e premete ↵ Invio:

# GRAFICI DI DISPERSIONE MULTIPLI 
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(car) # carica il pacchetto per la grafica
windows() # apre e inizializza una nuova finestra grafica
#
# grafici di dispersione con istogrammi delle variabili
#
scatterplotMatrix(~rcc+wcc+hc+hg+ferr, col="black", pch=20, regLine = list(method=lm, lty=1, lwd=2, col="chartreuse3"), smooth=FALSE, diagonal=list(method ="histogram", breaks="FD"), main="Matrice di dispersione con rette di regressione", data=ais) # mostra il grafico
#

L'argomento ~rcc+wcc+hc+hg+ferr definisce le variabili da rappresentare, e può essere facilmente riscritto aggiungendo e togliendo variabili per cambiare la rappresentazione a piacere. 


Per la retta di regressione sono impiegati una linea continua (lty=1), uno spessore doppio (lwd=2) e un colore (col="chartreuse3") diverso dal nero, mentre l'argomento smooth=FALSE fa si che non venga aggiunta ai grafici la rappresentazione della funzione non lineare prevista di default nel pacchetto car.

Infine l'argomento diagonal=list() indica la rappresentazione della variabile riportata nella diagonale, che qui è l'istogramma (method ="histogram") con il numero di classi (breaks="FD") calcolato mediante la regola di Freedman-Diaconis. L'istogramma può essere sostituito con altri tipi di rappresentazione, l'elenco delle espressioni che è possibile impiegare in alternativa per questo argomento (provatele) è:
→ diagonal=list(method="density",  bw="nrd0", adjust=1, kernel="gaussian", na.rm=TRUE)
→ diagonal=list(method="boxplot")
→ diagonal=list(method="qqplot")
→ diagonal=list(method="oned")

Infine copiate e incollate nella Console di R lo script e premete ↵ Invio:

# GRAFICI DI DISPERSIONE MULTIPLI ordinati in base al valore di r
#
library(DAAG) # carica il pacchetto incluso il set di dati ais
library(gclus) # carica il pacchetto per la grafica
windows() # apre e inizializza una nuova finestra grafica
mydata <- ais[c(1,2,3,4,5)] # tabella con i dati delle variabili delle colonne 1,2,3,4,5
mydata.r <- abs(cor(mydata)) # calcola la correlazione
mydata.col <- dmat.color(mydata.r) # applica i colori
mydata.o <- order.single(mydata.r) # ordina le variabili, le meglio correlate più vicine alla diagonale
cpairs(mydata, mydata.o, panel.colors=mydata.col, gap=.5, main="Variabili meglio correlate vicine alla diagonale") # mostra il grafico
#

In quest'ultimo caso viene realizzato un grafico di dispersione multiplo che incrocia ancora i dati ematologici degli atleti contenuti nelle cinque variabili rcc (eritrociti), wcc (leucociti), hc (ematòcrito), hg (emoglobina) e ferr (ferritina) ma con due novità.


La prima è che le variabili ora sono individuate non mediante il loro nome bensì indicando, con l'espressione ais[c(1,2,3,4,5)], il set di dati che le contiene e il numero della colonna corrispondente a ciascuna variabile

La seconda novità è che impiegando la funzione cpairs() [7] abbiamo un grafico di dispersione multiplo ordinato in base al valore del coefficiente di correlazione r di Pearson, in modo che le variabili meglio correlate siano le più vicine alla diagonale ed evidenziate in colore, aumentando così la chiarezza della rappresentazione grafica.

Potete riutilizzare facilmente lo script sostituendo all'oggetto ais l'oggetto contenente i vostri dati, opportunamente strutturati, e modificando conseguentemente i nomi della variabili. Per una guida rapida all'importazione dei dati potete consultare i post:

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

[2] Per la documentazione sugli argomenti della funzione plot() digitare help(plot) nella Console di R, e in aggiunta consultare la documentazione sugli argomenti della funzione par() con help(par).

[3] Per i diversi simboli che è possibile impiegare per tracciare i punti vedere il post I simboli dei punti di R.

[4] Per i colori che è possibile impiegare vedere il post La tabella dei colori di R.

[5] Per le linee che è possibile impiegare vedere il post Gli stili delle linee di R.


[7] Digitate help(cpairs) nella Console di R per la documentazione della funzione cpairs() ovvero consultate il manuale di riferimento del pacchetto gclus su: Available CRAN Packages By Name.
https://cran.r-project.org/web/packages/available_packages_by_name.html