lunedì 2 ottobre 2023

Istogrammi affiancati, sovrapposti e contrapposti

Abbiamo già visto [1] che per affiancare due istogrammi è sufficiente disporli in due colonne affiancate, ma qui lo facciamo con un piccolo trucco che può essere utile conoscere perché può essere impiegato in varie situazioni per migliorare l'estetica dei grafici, copiate e incollate questo script nella Console di R e premete ↵ Invio:

# DUE ISTOGRAMMI AFFIANCATI
#
library(DAAG) # carica il pacchetto DAAG che include il set di dati ais
f <-as.matrix(subset(ais, sex=="f", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=f
m <-as.matrix(subset(ais, sex=="m", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=m
#
windows() # apre e inizializza una nuova finestra grafica
dev.new(unit="cm", width=30, height=15) # nuova dimensione della finestra grafica
par(mfrow=c(1,2)) # grafici organizzati in una riga e due colonne
#
hist(f, xlim=c(3,7), ylim=c(0,30), breaks=sqrt(length(f)), col=rgb(1,0,0,0.5), main="Istogrammi affiancati", xlab="Eritrociti in 10^12/L", ylab="Frequenza (numero dei casi)") # istogramma di f
legend("topright", legend=c("f"), col=c(rgb(1,0,0,0.5)), pt.cex=2, pch=15) # riporta la legenda
hist(m, xlim=c(3,7), ylim=c(0,30), breaks=sqrt(length(m)), col=rgb(0,1,0,0.5), main="", xlab="Eritrociti in 10^12/L", ylab="Frequenza (numero dei casi)") # istogramma di m
legend("topright", legend=c("m"), col=c(rgb(0,1,0,0.5)), pt.cex=2, pch=15) # riporta la legenda
#

Dopo avere caricato il pacchetto DAAG che contiene il set di dati ais [2], a partire dai valori di concentrazione dei globuli rossi nel sangue che che sono stati determinati in 202 atleti, 100 donne e 102 uomini, contenuti nella variabile rcc del set di dati ais, riportiamo (<-) nell'oggetto f sotto forma di matrice (as.matrix) – con la funzione subset() che li estrae selezionandoli con select=c(rcc) – i valori di concentrazione dei globuli rossi dei soggetti di sesso femminile (sex=="f"). 

Ripetiamo la cosa riportando nell'oggetto m i valori di concentrazione dei globuli rossi dei soggetti di sesso maschile (sex=="m").

Dopo avere aperto una nuova finestra grafica con windows() ecco il trucco:
→ con dev.new() impostiamo nuove dimensioni per la finestra grafica;
→ impieghiamo come unità di misura i centimetri (unit="cm");
 portiamo la larghezza della finestra a 30 cm (width=30);
 fissiamo l'altezza della finestra a 15 cm (height=15);
→ con par(mfrow=c(1,2)) nella finestra grafica così ridimensionata organizziamo i grafici in una riga e due colonne.

E questo è il risultato ottenuto tracciando i due istogrammi con la funzione hist() e aggiungendo loro la legenda con la funzione legend() [3].


Ora vediamo nuovamente come sovrapporre due istogrammi sfruttando la trasparenza del colore, copiate e incollate questo script nella Console di R e premete ↵ Invio:

# DUE ISTOGRAMMI SOVRAPPOSTI CON TRASPARENZA DEL COLORE
#
library(DAAG) # carica il pacchetto DAAG che include il set di dati ais
f <-as.matrix(subset(ais, sex=="f", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=f
m <-as.matrix(subset(ais, sex=="m", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=m
#
windows() # apre e inizializza una nuova finestra grafica
#
hist(f, xlim=c(3,7), ylim=c(0,30), breaks=sqrt(length(f)), col=rgb(1,0,0,0.5), main="Istogrammi sovrapposti", xlab="Eritrociti in 10^12/L", ylab="Frequenza (numero dei casi)") # istogramma di f
hist(m, add=TRUE, xlim=c(3,7), ylim=c(0,30), breaks=sqrt(length(m)), col=rgb(0,1,0,0.5), ) # istogramma di m
legend("topright", legend=c("f","m"), col=c(rgb(1,0,0,0.5), rgb(0,1,0,0.5)), pt.cex=2, pch=15 ) # riporta la legenda
#

Qui le novità sono l'argomento add=TRUE che consente di sovrapporre il secondo istogramma al primo, e il quarto valore della funzione rgb() che viene posto uguale a 0.5 per assicurare la trasparenza al colore. 


In alternativa possiamo sovrapporre due istogrammi impiegando il tratteggio del colore, copiate e incollate questo script nella Console di R e premete ↵ Invio:

# DUE ISTOGRAMMI SOVRAPPOSTI CON TRATTEGGIO DEL COLORE
#
library(DAAG) # carica il pacchetto DAAG che include il set di dati ais
f <-as.matrix(subset(ais, sex=="f", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=f
m <-as.matrix(subset(ais, sex=="m", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=m
#
windows() # apre e inizializza una nuova finestra grafica
#
hist(f, xlim=c(3,7), ylim=c(0,30), breaks=sqrt(length(f)), border="red", col="red", density=20, angle=45, main="Istogrammi sovrapposti", xlab="Eritrociti in 10^12/L", ylab="Frequenza (numero dei casi)") # istogramma di f
hist(m, add=TRUE, xlim=c(3,7), ylim=c(0,30), breaks=sqrt(length(m)), border="green4", col="green4", density=20, angle=-45) # istogramma di m
legend("topright", legend=c("f","m"), fill=c("red","green4"), border=c("red","green4"), col=c("red","green4"), density=c(20,20), angle=c(45,-45)) # riporta la legenda
#

In questo,  caso stabilito che il colore deve occupare il 20% della superficie da colorare con density=20, per distinguere i due istogrammi nell'area di sovrapposizione è sufficiente porre l'inclinazione di un tratteggio a 45 gradi (angle=45) in un istogramma a - 45 gradi (angle=-45) nell'altro (ma anche a qualche altra angolazione a piacere).


Possiamo anche contrapporre due istogrammicopiate e incollate questo script nella Console di R e premete ↵ Invio:

# DUE ISTOGRAMMI CONTRAPPOSTI
#
library(DAAG) # carica il pacchetto DAAG che include il set di dati ais
f <-as.matrix(subset(ais, sex=="f", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=f
m <-as.matrix(subset(ais, sex=="m", select=c(rcc))) # estrae il sottoinsieme dei dati con sesso=m
#
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(2,1)) # grafici organizzati in due righe e una colonna
#
par(mar=c(0,5,3,3)) # adatta i margini al grafico superiore
hist(f, xaxt="n", xlim=c(3,7), ylim=c(0,30), breaks=sqrt(length(f)), col=rgb(1,0,0,0.5), las=1, main="Istogrammi contrapposti", xlab="", ylab="Frequenza (numero dei casi)") # istogramma di f
legend("topright", legend=c("f"), col=c(rgb(1,0,0,0.5)), pt.cex=2, pch=15) # riporta la legenda
par(mar=c(5,5,0,3)) # adatta i margini al grafico inferiore
hist(m, xlim=c(3,7), ylim=c(30,0), breaks=sqrt(length(m)), col=rgb(0,1,0,0.5), las=1, main="", xlab="rcc", ylab="Frequenza (numero dei casi)") # istogramma di m
legend("right", legend=c("m"), col=c(rgb(0,1,0,0.5)), pt.cex=2, pch=15) # riporta la legenda
par(mar=c(5.1,4.1,4.1,2.1)) # ripristina i margini di default
#

Otteniamo questo risultato


ed è più facile di quanto possa sembrare, perché a parte la necessità di organizzare i grafici in due righe e una colonna con par(mfrow=c(2,1)) e non rappresentare l'asse delle ascisse del primo istogramma (xaxt="n"), il punto che sembra più complesso, cioè ribaltare la rappresentazione del secondo istogramma, lo si risolve semplicemente invertendo le coordinate dell'asse delle y con ylim=c(30,0). Il resto è rappresentato dal semplice adattamento dei margini dei due istogrammi con par(mar=....) assegnando loro opportuni valori [4].



---------

[1] Vedere il post Istogrammi.

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

[3] Per gli argomenti impiegati vedere i post che trattano degli istogrammi e dell'aggiunta delle legende ai grafici, o digitare help(nomedellafunzione) nella Console di R per la documentazione ufficiale delle funzioni.

[4] Come personalizzare l'ampiezza dei margini lo trovate nella documentazione di R digitando help(par) nella Console di R.

Nessun commento:

Posta un commento