112 votes

Comment déplacer ou positionner une légende dans ggplot2

J'essaie de créer un graphique ggplot2 avec la légende sous le graphique.

Le livre ggplot2 indique à la page 112 "La position et la justification des légendes sont contrôlées par le paramètre de thème legend.position, et la valeur peut être droite, gauche, haut, bas, none (pas de légende), ou une position numérique".

Le code suivant fonctionne (puisque "right" est la valeur par défaut), et il fonctionne également avec "none" comme position de la légende, mais "left", "top", "bottom", tous échouent avec "Error in grid.Call.graphics("L_setviewport", pvp, TRUE) : Non-finite location and/or size for viewport".

library(ggplot2)
(myDat <- data.frame(cbind(VarX=10:1, VarY=runif(10)), 
    Descrip=sample(LETTERS[1:3], 10, replace=TRUE)))
qplot(VarX,VarY, data=myDat, shape=Descrip) + 
    opts(legend.position="right")

Qu'est-ce que je fais de mal ? Re-positionner une légende doit être incroyablement commun, donc je suppose que c'est moi.

125voto

hadley Points 33766

Dans les versions > 0.9.3 (quand opts était déprécié)

theme(legend.position = "bottom")

Version plus ancienne :

Malheureusement, il s'agit d'un bogue dans ggplot2 que j'espère vraiment corriger cet été.

Mise à jour :

Le bogue impliquant opts(legend.position = "left") a été corrigé en utilisant la version la plus récente de ggplot2 . De plus, la version 0.9.0 a vu l'introduction de guide_legend et guide_colorbar qui permettent un contrôle beaucoup plus fin de l'apparence et du positionnement des éléments dans la légende elle-même. Par exemple, la possibilité de spécifier le nombre de lignes et de colonnes pour les éléments de la légende.

0 votes

N'est-ce pas fait maintenant avec theme_update(legend.position = "bottom") ?

1 votes

@RuiVieira pour theme_update() voir ggplot2.tidyverse.org/reference/theme.html "Modifiez le thème d'un seul graphe en utilisant theme() ; voyez theme_update() si vous voulez modifier le thème actif, pour affecter tous les graphes suivants. "

25voto

SoilSciGuy Points 185

Juste quelques mises à jour de ces réponses pendant que je suis ici. Comme Hadley l'a mentionné, vous pouvez déplacer une légende vers le bas avec theme(legend.position = "bottom")

Ou se déplacer manuellement avec elle theme(legend.position = c(.2,.85))

Si vous voulez que la légende soit horizontale, utilisez theme(legend.position = c(.2,.85), legend.direction = "horizontal")

9voto

C8H10N4O2 Points 9172

Dans les versions plus récentes de ggplot2 vous pouvez utiliser + theme(legend.position='bottom') .

qplot(VarX,VarY, data=myDat, shape=Descrip) + 
  theme(legend.position='bottom')

enter image description here

Voir Livre de cuisine pour R - Légendes pour plus de légendes.

En réponse à un commentaire, theme_update() n'intervient pas si elle est invoquée au milieu d'un ggplot (comme dans + theme_update() seulement les fois suivantes. Il modifie également le thème actif et non pas seulement l'intrigue spécifique. Vous pourriez donc faire ceci :

theme_update(legend.position='bottom')
qplot(VarX,VarY, data=myDat, shape=Descrip) 

avec les mêmes résultats que ci-dessus, à la différence que les tracés suivants auront également la légende en bas par défaut.

5voto

Andreas Points 1632

Vous pouvez toujours placer la légende manuellement - mais comme l'étiquette est toujours empilée/verticale, c'est plutôt laid. J'espère vraiment qu'Hadley trouvera le temps de corriger ce problème :-)

p <- qplot(VarX,VarY, data=myDat, shape=Descrip) + 
opts(legend.position=c(.5,0.9),plot.margin = unit(c(6,0,0,0), "lines"))

9 votes

opts() est désormais obsolète - utilisez guide_legend() à la place. docs.ggplot2.org/0.9.2.1/guide_legend.html

1 votes

Vous pouvez appeler legend.direction = "horizontal" sur theme argument.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X