domenica 1 dicembre 2019

Inserire più grafici nella stessa immagine

Vediamo come sia possibile disporre in vari modi più grafici all'interno di una stessa immagine impiegando una sola riga di codice.

Per farlo ci serviamo delle funzioni par()layout() e matrix() [1] impiegando come esempi alcuni grafici realizzati con la funzione boxplot() [2].

Il codice impiega solamente le funzioni grafiche di base di RI dati sono contenuti nella tabella ais del pacchetto DAAG - accertatevi di avere installato il pacchetto o in alternativa procedete come indicato in [3].

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

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(2,2)) # quattro grafici in due righe per due colonne
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [1] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [2] valori dell'altezza aggregati per sesso
#
boxplot(ais$bmi~ais$sex, xlab="Sesso", ylab="BMI in kg/m2", notch=TRUE, col="green") # [3] valori dell'indice di massa coroporea (BMI) aggregati per sesso
#
boxplot(ais$pcBfat~ais$sex, xlab="Sesso", ylab="Grasso corporeo in %", notch=TRUE, col="yellow") # [4] valori della percentuale di grasso corporeo aggregati per sesso
#

In questo primo script con par(mfrow=c(2,2)) è stata predisposta la suddivisione della finestra grafica in 2 righe per 2 colonne, quindi in quattro quadranti,

1
2
3
4

nei quali sono inseriti, procedendo da sinistra verso destra e dall'alto verso il basso, i quattro grafici realizzati con la funzione boxplot() sui dati separati per sesso (~ais$sex) della tabella ais - impiegando l'argomento notch=TRUE per riportare sui lati dei box le tacche (notch) o incisure che rappresentano i limiti di confidenza al 95% della mediana - con questo risultato.


Ora copiate lo script che segue, incollatelo nella Console di R e premete ↵ Invio:

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(1,2)) # due grafici in una riga e due colonne
#
boxplot(ais$bmi~ais$sex, xlab="Sesso", ylab="BMI in kg/m2", notch=TRUE, col="green") # [1] boxplot per sesso dell'indice di massa corporea (BMI)
#
boxplot(ais$pcBfat~ais$sex, xlab="Sesso", ylab="Grasso corporeo in %", notch=TRUE, col="yellow") # [2] boxplot per sesso della percentuale di grasso corporeo
#

In questo secondo script con par(mfrow=c(1,2)) è stata predisposta la suddivisione della finestra in 1 riga e 2 colonne


1

2

per realizzare due grafici affiancati, il primo sulla sinistra e il secondo sulla destra, con questo risultato.


Copiate questo terzo script, incollatelo nella Console di R e premete ↵ Invio:

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
par(mfrow=c(2,1)) # due grafici in una colonna e due righe
#
boxplot(ais$pcBfat~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Percentuale di grasso corporeo nei vari sport", xlab="Sport praticato", ylab="Grasso corporeo in %", notch=FALSE, col="yellow") # [1] valori della percentuale di grasso corporeo aggregati per sport
#
boxplot(ais$wt~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Peso corporeo nei vari sport", xlab="Sport praticato", ylab="Peso corporeo in kg", notch=FALSE, col="yellow") # [2] valori del peso corporeo aggregati per sport
#

In questo caso con par(mfrow=c(2,1)) è stata predisposta la suddivisione della finestra in 2 righe e 1 colonna 
- riportando i boxplot in verticale (horizontal=FALSE), le etichette delle ascisse in verticale (las=2), riducendo la larghezza dei box (boxwex=0.4) e senza le incisure (notch=FALSEche rappresentano i limiti di confidenza al 95% della mediana - per posizionare i due grafici uno sopra l'altro in questo modo

1
2

con questo risultato.


Potete anche aumentare il numero delle righe e/o delle colonne, prestando ovviamente sempre molta attenzione alla leggibilità e alla fruibilità del risultato finale.

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

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
layout(matrix(c(1,1,2,3), 2, 2, byrow=TRUE)) # tre grafici, il primo occupa riga 1/colonne 1 e 2, il secondo riga 2/colonna 1, il terzo riga 2/colonna 2
#
boxplot(ais$pcBfat~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Percentuale di grasso corporeo nei vari sport", xlab="Sport praticato", ylab="Grasso corporeo in %", notch=FALSE, col="yellow") # [1] valori della percentuale di grasso corporeo aggregati per sport
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [2] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [3] valori di altezza aggregati per sesso
#

In questo caso vediamo come organizzare i grafici all'interno dell'immagine in maniera più articolata con layout(matrix(c(1,1,2,3), 2, 2, byrow=TRUE)). Viene infatti predisposta la suddivisione della finestra in 2 righe per 2 colonne (... 2, 2, ...) procedendo per riga (byrow=TRUE), ma specificando con il primo argomento c(1,1,2,3) che il primo grafico occuperà riga 1/colonne 1 e 2, il secondo grafico occuperà riga 2/colonna 1 e il terzo grafico occuperà riga 2/colonna 2, con questa logica

1     1
2
3

e questo risultato.



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

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
windows() # apre e inizializza una nuova finestra grafica
layout(matrix(c(1,3,2,3), 2, 2, byrow=TRUE)) # (4) tre grafici, il primo occupa riga 1/colonna 1, il secondo riga 2/colonna 1, il terzo righe 1 e 2/colonna 2
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [1] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [2] valori di altezza aggregati per sesso
#
boxplot(ais$pcBfat~ais$sport, horizontal=TRUE, boxwex=0.4, cex.axis=0.8, las=1, xlab="Grasso corporeo in %", ylab="Sport praticato", notch=FALSE, col="yellow") # [3] valori della percentuale di grasso corporeo aggregati per sport
#

In questo script con layout(matrix(c(1,3,2,3), 2, 2, byrow=TRUE)) è stata predisposta di nuovo la suddivisione della finestra in 2 righe per 2 colonne (... 2, 2, ...) procedendo per riga (byrow=TRUE), ma questa volta specificando con il primo argomento c(1,3,2,3) che il primo grafico occuperà riga 1/colonna 1, il secondo grafico occuperà riga 2/colonna 1 e il terzo grafico occuperà le righe 1 e 2 della colonna 2 
- con i boxplot in orizzontale (horizontal=TRUE) e le etichette delle ascisse in orizzontale (las=1) - con questa logica

1
3

3
2

 e con questo risultato.


Finora abbiamo visto come organizzare più grafici all'interno della finestra grafica standard. Ma potremmo volere ampliare la finestra grafica, come facciamo ora riprendendo l'esempio precedente.

Copiate quest'ultimo script, incollatelo nella Console di R e premete ↵ Invio:

# INSERIRE PIU' GRAFICI NELLA STESSA IMMAGINE 
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
#
dev.new(width=45, height=15, unit="cm") # nuova dimensione della finestra grafica
layout(matrix(c(1,2,3), 1, 3, byrow=TRUE)) # tre grafici in 1 riga e 3 colonne 
#
boxplot(ais$wt~ais$sex, xlab="Sesso", ylab="Peso corporeo in kg", notch=TRUE, col="green") # [1] valori del peso corporeo aggregati per sesso
#
boxplot(ais$ht~ais$sex, xlab="Sesso", ylab="Altezza in cm", notch=TRUE, col="green") # [2] valori di altezza aggregati per sesso
#
boxplot(ais$pcBfat~ais$sport, horizontal=FALSE, boxwex=0.4, cex.axis=0.8, las=2, main="Percentuale di grasso corporeo nei vari sport", xlab="Sport praticato", ylab="Grasso corporeo in %", notch=FALSE, col="yellow") # [3] valori della percentuale di grasso corporeo aggregati per sport
#

Per specificare le nuove dimensioni della finestra grafica impieghiamo la funzione dev.new() che richiede semplicemente larghezza della finestra, altezza della finestra e unità di misura. Queste possono essere pollici (unit="in"), pixel (unit="px") o centimetri (unit="cm"), come facciamo noi definendo quindi una finestra molto ampia, di 45 centimetri di larghezza (width=) per 15 centimetri di altezza (height=).

La funzione layout(matrix(c(1,2,3), 1, 3, byrow=TRUE)) predispone la suddivisione della finestra in 1 riga per 3 colonne (... 1, 3, ...)
 procedendo per riga (byrow=TRUE) specificando con c(1,2,3) che vogliamo tre grafici affiancati, con questa logica

1

2

3


e con questo risultato:


Nel caso dei grafici generati con il pacchetto ggplot2 per disporre più grafici all'interno della stessa immagine è necessario impiegare la funzione grid.arrange() inclusa nel pacchetto gridExtra [4]: per esempi di applicazione di questa funzione fate click su ggplot2 nelle Parole chiave oppure digitate ggplot o, ancor più selettivo, grid.arrange nella casella Cerca nel blog quindi fate click su Cerca.

Infine ricordo che impiegando l'utilità riportata nel post Salvare i grafici di R in un file potete salvare le immagini realizzate con R sotto forma di file .bmp, .jpeg, .png, .pdf, .ps per poterle stampare, archiviare, inserire in una pubblicazione, in un post o in un sito web.


----------

[1] Digitate help(nomedellafunzione) nella Console di R per consultare la documentazione delle funzioni.

[2] La funzione boxplot() è illustrata nel post Grafici a scatola con i baffi (boxplot).

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

[4] Il manuale di riferimento Package ‘gridExtra’ lo trovate facendo click sul link alla voce Reference manual nella pagina di documentazione del pacchetto. URL consultato il 03/12/2022.


Nessun commento:

Posta un commento