web-dev-qa-db-fra.com

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

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

Le livre de ggplot2 dit à la p 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, aucune (pas de légende) ou une position numérique".

Le code suivant fonctionne (puisque "droite" c'est la valeur par défaut), et il fonctionne également avec "aucun" comme position de légende, mais "gauche", "haut", "bas", tous échouent avec "Erreur dans la grille. Appel .graphics ("L_setviewport", pvp, TRUE): Emplacement et/ou taille non finis pour la fenêtre "

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 mal? Le repositionnement d'une légende doit être incroyablement courant, donc je pense que c'est moi.

58
Dan Goldstein

Dans les versions> 0.9.3 (lorsque opts était obsolète)

theme(legend.position = "bottom")

ancienne version:

Malheureusement, c'est un bug dans ggplot2 que j'espère vraiment 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 capacité spécifie le nombre de lignes et de colonnes pour les éléments de légende.

58
hadley

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 déplacez-vous 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")

4
SoilSciGuy

Vous pouvez toujours placer la légende manuellement - mais comme l'étiquette est toujours empilée/verticale, elle a l'air plutôt moche. J'espère vraiment que hadley trouvera le temps de résoudre 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"))
3
Andreas

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 Cookbook for R - Legends pour plus de bonté de légendes.

En réponse à un commentaire, theme_update() ne se déclenche pas si elle est invoquée au milieu d'un ggplot (comme dans + theme_update(), uniquement les heures suivantes. Elle modifie également le thème actif plutôt que simplement l'intrigue spécifique. Vous pouvez donc faire ceci:

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

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

2
C8H10N4O2