legenda ggplot2 para baixo e horizontal

109

Como posso mover uma legenda ggplot2 para a parte inferior do gráfico e girá-la horizontalmente?

Código de amostra:

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

Resultado desejado (aproximado): insira a descrição da imagem aqui

Tyler Rinker
fonte
2
Após 7 anos e 8 meses, finalmente descobri como obter o resultado desejado para esta pergunta :) Role para baixo até a segunda resposta.
Arthur Yip

Respostas:

146

Se você deseja mover a posição da legenda, use o seguinte código:

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

Isso deve dar a você o resultado desejado. Legenda no fundo

Shreyas Karnik
fonte
2
você sabe se é possível desenhar uma barra de legenda contínua na parte inferior? (não com o número no meio, mas no topo). obrigado.
Janvb
3
Com a corrente ggplot, isso me dá o aviso 'opts' is deprecated. Use 'theme' instead. (Deprecated; last used in version 0.9.1). Substituindo optspor themeobras.
krlmlr de
Sim, prevejo que haverá uma mudança no funcionamento interno doggplot
Shreyas Karnik,
10
É uma má prática usar itens depreciados. Você pode fazer isso usando o tema exatamente da mesma maneira:+ theme(legend.position='bottom')
até 0
infelizmente, há alguma ambigüidade quando os números e as cores estão lado a lado; veja minha resposta abaixo em várias tentativas de melhorar isso.
Arthur Yip
37

Aqui está como criar o resultado desejado:

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

Criado em 07/12/2019 pelo pacote reprex (v0.3.0)


Editar: não há mais necessidade dessas opções imperfeitas, mas estou deixando-as aqui para referência.

Duas opções imperfeitas que não fornecem exatamente o que você estava pedindo, mas muito próximas (pelo menos colocarão as cores juntas).

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

Criado em 28/02/2019 pelo pacote reprex (v0.2.1)

Arthur Yip
fonte
Embora isso possa teoricamente responder à pergunta, seria preferível incluir as partes essenciais da resposta aqui e fornecer o link para referência.
Rohit Gupta de
Agora melhorei minha resposta para fornecer duas soluções imperfeitas
Arthur Yip