Remova legendas extras em ggplot2

93

Eu tenho um quadro de dados simples que estou tentando fazer um gráfico combinado de linha e ponto usando ggplot2. Supondo que meus dados sejam assim:

df <- data.frame(x=rep(1:10,2), y=c(1:10,11:20), 
                 group=c(rep("a",10),rep("b",10)))

E estou tentando fazer um enredo:

g <- ggplot(df, aes(x=x, y=y, group=group))
g <- g + geom_line(aes(colour=group))
g <- g + geom_point(aes(colour=group, alpha = .8))
g

O resultado parece bom com uma exceção. Tem uma legenda extra mostrando o alphapara minha geom_pointcamada.

Legenda extra para transparência <code> geom_point </code>

Como posso manter a legenda mostrando as cores do grupo, mas não aquela que mostra minhas configurações alfa?

Wilduck
fonte

Respostas:

178

A estética pode ser definida ou mapeada em uma ggplotchamada.

  • Uma estética definida dentro aes(...)é mapeada a partir dos dados e uma legenda criada.
  • Uma estética também pode ser definida para um único valor, definindo-o externamente aes().

Neste caso, parece que você deseja definir alpha = 0.8 e mapear colour = group .

Para fazer isso,

Coloque o alpha = 0.8lado de fora da aes()definição.

g <- ggplot(df, aes(x = x, y = y, group = group))
g <- g + geom_line(aes(colour = group))
g <- g + geom_point(aes(colour = group), alpha = 0.8)
g

insira a descrição da imagem aqui

Para qualquer variável mapeada , você pode suprimir a aparência de uma legenda usando guide = 'none'na scale_...chamada apropriada . por exemplo.

g2 <- ggplot(df, aes(x = x, y = y, group = group)) + 
        geom_line(aes(colour = group)) +
        geom_point(aes(colour = group, alpha = 0.8))
g2 + scale_alpha(guide = 'none')

Que retornará um gráfico idêntico

O comentário do EDIT @ Joran está correto, tornei minha resposta mais abrangente

mnel
fonte
18
Este é o método correto, já que o OP está definindo em vez de mapear uma estética, mas em geral você pode suprimir a aparência de qualquer legenda usando algo semelhante g + scale_alpha(guide = "none").
joran
De fato. A resposta foi elaborada. Faz mais sentido ter uma resposta abrangente, não apenas específica para a questão do OP.
mês de
4
Muito obrigado pela explicação adicionada. Isso me ajuda muito a entender a filosofia do ggplot.
Wilduck
2
Estou usando o ggplot por mais de um ano e NUNCA entendi a diferença entre uma variável mapeada ou definida. Esta é de longe a melhor resposta que já vi, parabéns.
Amit Kohli
1
@theforestecologist Isso porque a groupestética não gera escalas ou guias por conta própria. É sempre uma espécie de modificação de outra coisa. Você nunca terá uma lenda pela estética do "grupo".
joran
43

Basta adicionar o show.legend = Fcódigo após a parte que você não quer.

g <- ggplot(df, aes(x=x, y=y, group=group))
g <- g + geom_line(aes(colour=group))
g <- g + geom_point(aes(colour=group, alpha = .8), show.legend = F)
CSV
fonte
1
Isso é muito mais intuitivo do que mapear vs definir a estética (embora isso também
elimine
1

Para versões antigas do ggplot2 (versões anteriores a 0.9.2, lançadas no final de 2012), esta resposta deve funcionar:

Tentei fazer isso com um colour_scalee não funcionou. Parece que o colour_scale_hueitem funciona como uma função com um parâmetro padrão TRUE. Eu adicionei scale_colour_hue(legend=FALSE)e funcionou.

Não tenho certeza se este é o caso para todos os itens de escala de cores no ggplot

Georgette
fonte
3
O uso legendem uma scale_*chamada está obsoleto, é melhor fazer scale_colour_hue(guide = "none").
Gregor Thomas
3
levando em consideração que o legend=FALSEestá obsoleto, conforme apontado pelo comentário de @shujaa, esta é efetivamente uma resposta duplicada, ou seja, adicionar o guide = "none"a uma scale_fill/color*função.
David LeBauer