ggplot2 legenda do dołu i poziomo

109

Jak mogę przenieść legendę ggplot2 na dół wykresu i obrócić ją poziomo?

Przykładowy kod:

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())

Pożądany (przybliżony) wynik: wprowadź opis obrazu tutaj

Tyler Rinker
źródło
2
Po 7 latach i 8 miesiącach w końcu wymyśliłem, jak uzyskać pożądany efekt na to pytanie :) Przewiń w dół do drugiej odpowiedzi.
Arthur Yip

Odpowiedzi:

146

Jeśli chcesz przesunąć pozycję legendy, użyj następującego kodu:

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")

To powinno dać pożądany efekt. Legenda na dole

Shreyas Karnik
źródło
2
czy wiesz, czy możliwe jest narysowanie ciągłego paska legendy na dole? (więc nie z liczbą pomiędzy, ale na górze). dzięki.
Janvb
3
W przypadku prądu ggplotto daje mi ostrzeżenie 'opts' is deprecated. Use 'theme' instead. (Deprecated; last used in version 0.9.1). Wymiana optsprzez themeprace.
krlmlr
Tak, spodziewam się zmiany w wewnętrznym działaniuggplot
Shreyas Karnik,
10
Korzystanie z pozycji amortyzowanych jest złą praktyką. Możesz to zrobić używając motywu dokładnie w ten sam sposób:+ theme(legend.position='bottom')
0
niestety istnieje pewna niejednoznaczność, gdy liczby i kolory są obok siebie; zobacz moją odpowiedź poniżej na kilka prób poprawy tego.
Arthur Yip
37

Oto, jak uzyskać pożądany efekt:

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"))

Utworzono 07.12.2019 przez pakiet reprex (v0.3.0)


Edycja: nie ma już potrzeby stosowania tych niedoskonałych opcji, ale zostawiam je tutaj w celach informacyjnych.

Dwie niedoskonałe opcje, które nie dają dokładnie tego, o co prosiłeś, ale całkiem zbliżone (przynajmniej połączą kolory).

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")

Utworzono 28.02.2019 r. Przez pakiet reprex (v0.2.1)

Arthur Yip
źródło
Chociaż może to teoretycznie odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia.
Rohit Gupta
Teraz rozszerzyłem moją odpowiedź, aby zapewnić dwa niedoskonałe rozwiązania
Arthur Yip