Légende ggplot2 en bas et à l'horizontale


109

Comment puis-je déplacer une légende ggplot2 vers le bas du graphique et la tourner horizontalement?

Exemple de code:

library(reshape2) # for melt
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend())

Résultat souhaité (approximatif): entrez la description de l'image ici


2
Après 7 ans et 8 mois, j'ai finalement compris comment obtenir le résultat souhaité pour cette question :) Faites défiler jusqu'à la deuxième réponse.
Arthur Yip

Réponses:


146

Si vous souhaitez déplacer la position de la légende, veuillez utiliser le code suivant:

library(reshape2) # for melt
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend()) +
    theme(legend.position="bottom")

Cela devrait vous donner le résultat souhaité. Légende en bas


2
savez-vous s'il est possible de dessiner une barre de légende continue en bas? (donc pas avec le nombre entre les deux mais en haut). Merci.
Janvb

3
Avec le courant ggplot, cela me donne l'avertissement 'opts' is deprecated. Use 'theme' instead. (Deprecated; last used in version 0.9.1). Remplacement optspar des themeœuvres.
krlmlr

Oui, je prévois qu'il y aura un changement dans le fonctionnement interne deggplot
Shreyas Karnik

10
L'utilisation d'éléments amortis est une mauvaise pratique. Vous pouvez le faire en utilisant le thème exactement de la même manière:+ theme(legend.position='bottom')
par0

malheureusement, il y a une certaine ambiguïté lorsque les nombres et les couleurs sont côte à côte; voir ma réponse ci-dessous à plusieurs tentatives pour améliorer cela.
Arthur Yip

37

Voici comment créer le résultat souhaité:

library(reshape2); library(tidyverse)
melt(outer(1:4, 1:4), varnames = c("X1", "X2")) %>%
ggplot() + 
  geom_tile(aes(X1, X2, fill = value)) + 
  scale_fill_continuous(guide = guide_legend()) +
  theme(legend.position="bottom",
        legend.spacing.x = unit(0, 'cm'))+
  guides(fill = guide_legend(label.position = "bottom"))

Créé le 2019-12-07 par le package reprex (v0.3.0)


Edit: plus besoin de ces options imparfaites, mais je les laisse ici pour référence.

Deux options imparfaites qui ne vous donnent pas exactement ce que vous vouliez, mais assez proches (vont au moins rassembler les couleurs).

library(reshape2); library(tidyverse)
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend()) +
 theme(legend.position="bottom", legend.direction="vertical")

p1 + scale_fill_continuous(guide = "colorbar") + theme(legend.position="bottom")

Créé le 2019-02-28 par le package reprex (v0.2.1)


Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien pour référence.
Rohit Gupta

J'ai maintenant amélioré ma réponse pour fournir deux solutions imparfaites
Arthur Yip
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.