giovedì 27 dicembre 2018

Aggiungere la legenda a un grafico

I modi per aggiungere una legenda a un grafico sono dispersi qua e la nei post di questo blog. Vale quindi la pena di farne una sintesi riportando gli esempi più significativi, basati sull'impiego della funzione legend() e realizzati senza la necessità di installare pacchetti aggiuntivi ma impiegando solamente le funzioni statistiche e grafiche di base di R.

Nel primo esempio realizziamo la legenda che combina simboli e testo per identificare le tre rette di regressione riportate nel grafico, calcolate con altrettanti modelli basati su differenti assunti [1].

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

# LEGENDA con simboli e testo
#
x <- c(9,10,11,9,10,10,11) # variabile in ascisse
y <- c(9,10,11,10,9,11,10) # variabile in ordinate
windows() # apre e inizializza una nuova finestra grafica
#
plot(x, y, xlim=c(0,15), ylim=c(0,15), main="LEGENDA con simboli e testo") # grafico dei dati
abline(5, 0.5, lty=2, col="blue") # retta x variabile indipendente
abline(-10, 2, lty=3, col="red") # retta y variabile indipendente
abline(0, 1, lty=4, col="black") # retta media geometrica
#
legend(0, 15, legend=c("regressione x variabile indipendente", "regressione y variabile indipendente", "regressione media geometrica"), lty=c(2,3,4), col=c("blue", "red", "black"), cex=0.8, title="Regressione lineare con tre metodi") # aggiunge al grafico la legenda
#


La legenda necessaria per identificare le tre rette riportate nel grafico viene realizzata mediante la funzione legend() impiegando come argomenti:
0 che specifica il valore della x al quale posizionare l'angolo superiore sinistro della legenda;
15 che specifica il valore della y al quale posizionare l'angolo superiore sinistro della legenda;
legend= che specifica con la funzione c( , , ) le tre righe di testo, uno per ciascuna retta, che compaiono nella legenda;
→ lty= che specifica con la funzione c( , , ) i tre stili delle linee corrispondenti a quelli delle rette tracciate nel grafico - da notare che specificando lty (o lwd cioè lo spessore della linea) la funzione legend() traccia automaticamente accanto alle righe di testo della legenda il simbolo rappresentato da un segmento di retta;
col= che specifica con la funzione c( , , ) i tre colori corrispondenti e quelli delle rette tracciate nel grafico [2];
cex=0.8 che gestisce la dimensione della legenda (la rimpicciolisce lievemente rispetto al valore 1 di default);
title= che mostra sulla prima riga della legenda un titolo (facoltativo).

La posizione della legenda può essere definita anche sostituendo i due primi argomenti con "bottomright", "bottom", "bottomleft", "left", "topleft", "top", "topright", "right" e "center", con una personalizzazione meno spinta di quella possibile con l'impiego delle coordinate cartesiane, ma che può essere adeguata, come vediamo nel prossimo script.

Il secondo esempio illustra come generare una legenda che combina ancora simboli e testo, ma in modo leggermente diverso.

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

# LEGENDA con simboli e testo
#
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="LEGENDA con simboli e testo", 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("sesso f","sesso m"), fill=c("red","green4"), border=c("red","green4"), density=c(20,20), angle=c(45,-45)) # riporta la legenda
#


La legenda che identifica i due istogrammi è realizzata con la funzione legend() impiegando come argomenti:
"topright" che posiziona la legenda in alto a destra;
legend= che specifica le due righe di testo che compaiono nella legenda;
fill= che determina la comparsa accanto alle righe di testo di due quadrati che avranno all'interno i colori specificati;
border= che definisce i colori del bordo dei quadrati di cui al punto precedente;
density= che specifica la densità del colore indicato dall'argomento fill= e che con un valore uguale a 20 (linee per pollice) genera in entrambi i quadrati un tratteggio con questa densità, identica a  quella dei corrispondenti istogrammi;
angle=... che indicare l'angolo di pendenza del tratteggio che con un valore positivo dell'angolo (45) riprende lo stile del primo istogramma, inclinato da sinistra a destra dal basso in alto, e con un valore negativo dell'angolo (-45) riprende lo stile del secondo istogramma, inclinato da sinistra a destra dall'alto in basso.

Anche in questo caso la funzione c() consente di specificare uno per uno i valori degli argomenti per riportarli ai corrispondenti elementi del grafico.

Il terzo esempio illustra come impiegare la funzione paste() per riportare all'interno di una legenda righe che combinano testo e numeri.

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

# LEGENDA con testo e valori numerici
#  
x <- c(10376,9159,8290,7924,6872) # valori in ascisse 
y <- c(2441,2135,1948,1812,1756) # valori in ordinate 
windows() # apre e inizializza una nuova finestra grafica
#
reglin <- lm(y ~ x) # calcola la regressione lineare 
a <- reglin$coefficients[1] # intercetta a
b <- reglin$coefficients[2] # coefficiente angolare b
r <- cor(x, y, method="pearson") # coefficiente di correlazione r 
#  
plot(x, y, xlim=c(6000,11000), ylim=c(1500,2500), main="LEGENDA con testo e valori numerici") # grafico dei dati 
lines(c(min(x), max(x)), c(a+b*min(x), a+b*max(x)), col="black", lty=2, lwd=1) # retta di regressione  
#
legend(6000, 2500, legend=c(paste("Intercetta a =", round(a, digits=0)), paste("Coefficiente angolare b =", round(b, digits=3)), paste("Equazione: y =", round(a, digits=0), ifelse(sign(b) == 1, "+", "-"), round(b, digits=3), "· x"), paste("Coefficiente di correlazione r =", round(r, digits=3))), cex=0.8, title="Regressione lineare") # aggiunge al grafico la legenda
#


In questo caso la legenda, che riporta nel grafico l'equazione della retta di regressione e il coefficiente di correlazione lineare, viene realizzata impiegando come argomenti della funzione legend():
6000 che specifica il valore della x al quale posizionare l'angolo superiore sinistro della legenda;
2500 che specifica il valore della y al quale posizionare l'angolo superiore sinistro della legenda;
legend= che specifica mediante la funzione c() le quattro righe che compaiono nella legenda, ciascuna delle quali è generata mediante la funzione paste() che combina uno o più testi inclusi nelle virgolette "...." con uno o più valori numerici arrotondati mediante la funzione round(), mentre la funzione ifelse() riporta il segno corretto nell'equazione della retta di regressione;
cex=0.8 che gestisce la dimensione della legenda (la rimpicciolisce lievemente rispetto al valore 1 di default);
title= che mostra sulla prima riga della legenda un titolo (facoltativo).

Il quarto esempio impiega i dati della tabella ais inclusa nel pacchetto DAAG. Potete scaricare il pacchetto dal CRAN oppure acquisire la tabella seguendo le indicazioni alternative riportate in [3].

L'esempio illustra come generare una legenda liberamente posizionabile: dopo avere tracciato i grafici separati per sport praticato e per sesso, lo script rimane in attesa. A questo punto bisogna posizionare il mouse dove si vuole che compaia la legenda e fare click con il tasto sinistro del mouse per farla comparire e terminare lo script.

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

# LEGENDA liberamente posizionabile
#
library(DAAG) # carica il pacchetto DAAG che include il set di dati ais
attach(ais) # impiega direttamente i nomi delle variabili senza specificare la tabella
windows() # apre e inizializza una nuova finestra grafica
#
boxplot(rcc~sex+sport, horizontal=FALSE, boxwex = 0.4, cex.axis = 0.8, las = 2, data=ais, main="LEGENDA liberamente posizionabile", xlab="", ylab="Eritrociti in 10^12/L", notch=FALSE, col=c("green", "yellow")) # eritrociti per ciascuno sport praticato
#
legend(locator(1), legend=c("sesso f","sesso m"), fill=c("green", "yellow")) # posiziona la legenda
#
detach(ais) # termina l'impiego diretto dei nomi delle variabili
#


La legenda viene realizzata mediante la funzione legend() impiegando come argomenti:
→ la funzione locator() che resta in attesa, legge la posizione del cursore grafico quando viene fatto click con il tasto sinistro del mouse, e posiziona la legenda;
legend= che specifica le due righe di testo che compaiono nella legenda;
fill= che determina la comparsa accanto alle righe di testo di due quadrati dei colori specificati.

Il codice riportato non consente di spostare la legenda. Se non si è soddisfatti della sua posizione, è necessario rieseguire l’intero script e fare nuovamente click con il tasto sinistro del mouse nel punto in cui si vuole posizionare la legenda.

Per le semplici legende che si possono inserire nei grafici a torta e nei grafici a barre si rimanda ai relativi post [4, 5].

Gli esempi forniti consentono di realizzare facilmente il codice necessario per inserire le legende nei propri grafici. Si consiglia di consultare il Manuale di Riferimento di R ovvero di digitare help(nomedellafunzione) nella Console di R per la documentazione degli argomenti che consentono di adattare e personalizzare le funzioni impiegate.

Infine se al vostro grafico avete aggiunto una legenda probabilmente volete non solo visualizzarlo, ma anche salvarlo sotto forma di file per archiviarlo o inserirlo in una pubblicazione, in un post o in un sito web. Trovate nel post Salvare i grafici di R in un file come farlo nei formati più diffusi.


----------

[1] L'argomento è trattato nel post La regressione lineare: assunti e modelli


[3] Vedere nel post Il set di dati ais come acquisire i dati della tabella ais anche senza istallare il pacchetto DAAG.

[4] Vedere il post Grafici a torta.

[5] Vedere il post Grafici a barre [1] e il post Grafici a barre [2].

Nessun commento:

Posta un commento