Une autre solution, outre les ondes déjà mentionnées (utilisation de layout
ou par(xpd=TRUE)
) consiste à superposer votre tracé avec un tracé transparent sur l'ensemble du dispositif, puis à y ajouter la légende.
L'astuce consiste à superposer un graphique (vide) sur la totalité de la zone de traçage et à y ajouter la légende. Nous pouvons utiliser la fonction par(fig=...)
option. Tout d'abord, nous demandons à R de créer un nouveau tracé sur l'ensemble du dispositif de traçage :
par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)
Réglage de oma
et mar
est nécessaire puisque nous voulons que l'intérieur du tracé couvre l'ensemble du dispositif. new=TRUE
est nécessaire pour empêcher R de démarrer un nouveau dispositif. Nous pouvons alors ajouter le plot vide :
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
Et nous sommes prêts à ajouter la légende :
legend("bottomright", ...)
ajoutera une légende en bas à droite de l'appareil. De même, nous pouvons ajouter la légende à la marge supérieure ou droite. La seule chose dont nous devons nous assurer est que la marge du tracé original est suffisamment grande pour accueillir la légende.
En mettant tout ça dans une fonction ;
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(...)
}
Et un exemple. Tout d'abord, créez le graphique en vous assurant que nous avons suffisamment d'espace en bas pour ajouter la légende :
par(mar = c(5, 4, 1.4, 0.2))
plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)
Ajoutez ensuite la légende
add_legend("topright", legend=c("Foo", "Bar"), pch=20,
col=c("steelblue", "indianred"),
horiz=TRUE, bty='n', cex=0.8)
Résultant en :
0 votes
...vous pouvez également pirater le par avec un conteneur factice pour la légende, facile et assez pratique de temps en temps. Question similaire aquí .
5 votes
@hhh Le lien ne fonctionne plus. Pouvez-vous le mettre à jour ou poster une réponse en utilisant cette approche ?