Como remover legend ggplot 2.2

250

Estou tentando manter a legenda de uma camada (suave) e remover a legenda da outra (ponto). Eu tentei desligar as lendas com guides(colour = FALSE)e geom_point(aes(color = vs), show.legend = FALSE).

Edit : Como esta pergunta e suas respostas são populares, um exemplo reproduzível parece em ordem:

library(ggplot2)
ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

insira a descrição da imagem aqui

Cara
fonte
5
Um exemplo reprodutível mínimo seria muito mais simples. Na longa linha de código, parece haver muito código desnecessário (para o problema em questão), além de ser totalmente improdutível, como está atualmente escrito.
mnel
Possível duplicado de Desligar algumas lendas em um ggplot
Umaomamaomao

Respostas:

445

do livro de receitas r , onde bp é seu ggplot:

Remova a legenda de uma estética específica (preenchimento):

bp + guides(fill=FALSE)

Isso também pode ser feito ao especificar a escala:

bp + scale_fill_discrete(guide=FALSE)

Isso remove todas as legendas:

bp + theme(legend.position="none")
user3490026
fonte
25
Como resposta a um comentário do @Alex: Observe que isso theme_bw()pode interferir em qualquer definição feita usando theme(). Ao usar theme_bw(), adicione-o à plotagem antes de alterar qualquer outra opção de tema.
Fabern3 de
1
mas quando faço algo assim bp + theme(legend.position="none") + theme_classic(), as lendas voltam. Então, como removê-lo?
amante
3
@loveR colocou theme_classic primeiro:bp + theme_classic() + theme(legend.position="none")
hipótese
1
Isso não teve efeito no meu enredo. Eu usei a abordagem do @Tjebo com sucesso.
James Hirschorn 14/02
80

Pode haver outra solução para isso:
Seu código foi:

geom_point(aes(..., show.legend = FALSE))

Você pode especificar o show.legendparâmetro após a aeschamada:

geom_point(aes(...), show.legend = FALSE)

então a legenda correspondente deve desaparecer

Tjebo
fonte
3
Esta é uma abordagem muito agradável. Mais intuitivo também.
patL
2
Esta foi a solução que funcionou para remover as letras da legenda quando usei geom_text para anotar linhas em cores. Não há scale_labelcomando (nem isso faz sentido) e guide(label = FALSE)também não funcionou. Obrigado!
Melissa Key
45

Como a pergunta e a resposta do usuário3490026 são os principais resultados da pesquisa, fiz um exemplo reproduzível e uma breve ilustração das sugestões feitas até agora, juntamente com uma solução que aborda explicitamente a pergunta do OP.

Uma das coisas que ggplot2faz e que pode ser confusa é que ela combina automaticamente certas legendas quando associadas à mesma variável. Por exemplo, factor(gear)aparece duas vezes, uma vez linetypee uma vez fill, resultando em uma legenda combinada. Por outro lado, gearpossui sua própria entrada de legenda, pois não é tratada da mesma forma que factor(gear). As soluções oferecidas até agora geralmente funcionam bem. Mas, ocasionalmente, pode ser necessário substituir os guias. Veja meu último exemplo na parte inferior.

# reproducible example:
library(ggplot2)
p <- ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

insira a descrição da imagem aqui

Remova todas as legendas: @ user3490026

p + theme(legend.position = "none")

Remova todas as legendas: @duhaime

p + guides(fill = FALSE, color = FALSE, linetype = FALSE, shape = FALSE)

Desativar legendas: @Tjebo

ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs), show.legend = FALSE) +
geom_point(aes(shape = factor(cyl)), show.legend = FALSE) +
geom_line(aes(linetype = factor(gear)), show.legend = FALSE) +
geom_smooth(aes(fill = factor(gear), color = gear), show.legend = FALSE) + 
theme_bw() 

Remova o preenchimento para que o tipo de linha fique visível

p + guides(fill = FALSE)

O mesmo que acima, através da função scale_fill_:

p + scale_fill_discrete(guide = FALSE)

E agora uma resposta possível à solicitação do OP

"para manter a legenda de uma camada (suave) e remover a legenda da outra (ponto)"

Desativar alguns ad-hoc post-hoc

p + guides(fill = guide_legend(override.aes = list(color = NA)), 
           color = FALSE, 
           shape = FALSE)  

insira a descrição da imagem aqui

PatrickT
fonte
2
Só notei a cor de preenchimento azul na última trama não aparece no gráfico, não sei porquê ...
PatrickT
Digite warnings()depois de executar seu código e você verá o (s) motivo (s) para a fita azul não aparecer.
markus
@markus: Entendi obrigado! Não vou me preocupar em editar o exemplo, pois o problema é separado. No entanto, faz pouco sentido ter uma legenda para sequando não é computada. Provavelmente vale a pena uma questão no github, mas não tenho energia agora ...
PatrickT
13

Se seu gráfico usa estética fille ambos color, você pode remover a legenda com:

+ guides(fill=FALSE, color=FALSE)
duhaime
fonte