Un'altra soluzione, oltre agli ondes già menzionati (usando layout
o par(xpd=TRUE)
) è quella di sovrapporre la trama con una trama trasparente sull'intero dispositivo e quindi aggiungere la legenda a quella.
Il trucco è quello di sovrapporre un grafico (vuoto) sull'intera area di stampa e aggiungere la legenda a quella. Possiamo usare l' par(fig=...)
opzione. Innanzitutto, chiediamo a R di creare un nuovo diagramma sull'intero dispositivo di stampa:
par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)
L'impostazione oma
ed mar
è necessaria poiché vogliamo che l'interno della trama copra l'intero dispositivo. new=TRUE
è necessario per impedire a R di avviare un nuovo dispositivo. Possiamo quindi aggiungere la trama vuota:
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
E siamo pronti per aggiungere la legenda:
legend("bottomright", ...)
aggiungerà una legenda in basso a destra del dispositivo. Allo stesso modo, possiamo aggiungere la legenda al margine superiore o destro. L'unica cosa che dobbiamo garantire è che il margine della trama originale sia abbastanza grande da accogliere la leggenda.
Mettere tutto questo in una funzione;
add_legend <- function(...) {
opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0),
mar=c(0, 0, 0, 0), new=TRUE)
on.exit(par(opar))
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
legend(...)
}
E un esempio Per prima cosa crea la trama assicurandoti di avere abbastanza spazio in basso per aggiungere la legenda:
par(mar = c(5, 4, 1.4, 0.2))
plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)
Quindi aggiungi la legenda
add_legend("topright", legend=c("Foo", "Bar"), pch=20,
col=c("steelblue", "indianred"),
horiz=TRUE, bty='n', cex=0.8)
Con il risultato di: