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

Tyler Rinker
la source
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

Shreyas Karnik
la source
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)

Arthur Yip
la source
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