Como alterar o título da legenda no ggplot

300

Eu tenho o seguinte gráfico como abaixo. Foi criado com este comando:

library(ggplot2)

df <- data.frame(cond = factor(rep(c("A", "B"), each = 200)), 
                 rating = c(rnorm(200), rnorm(200, mean=.8)))

ggplot(df, aes(x=rating, fill=cond)) + 
geom_density(alpha = .3) +
xlab("NEW RATING TITLE") +
ylab("NEW DENSITY TITLE")

Agora, a próxima coisa que quero fazer é modificar o título da legenda de cond para NEW LEGEND TITLE .

Então, o que eu fiz foi adicionar a seguinte linha e adicionar o final do código acima:

+labs(colour="NEW LEGEND TITLE")

Mas isso não funciona. Qual é o caminho certo para fazer isso?

insira a descrição da imagem aqui

neversaint
fonte
110
labs(fill="xyz")deve fazer
baptiste
1
@baptiste Voltei a esta pergunta inúmeras vezes sem perceber o seu comentário, você poderia escrevê-lo como resposta? IMO é a solução mais simples e merece algum reconhecimento
User632716
3
@ User632716 já está na resposta de alguém abaixo
baptiste
7
ele não funciona ...
shenglih
1
Para quem procura uma resposta envolvendo gráficos com várias geom_instruções, recomendo a resposta em stackoverflow.com/a/38485985/1169233 , é a única que funcionou para mim.
Waldir Leoncio

Respostas:

348

Isso deve funcionar:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
p <- p + guides(fill=guide_legend(title="New Legend Title"))

(ou alternativamente)

p + scale_fill_discrete(name = "New Legend Title")
Uma corrida
fonte
10
Outra alternativa ép$labels$fill <- "New Legend Title"
Alex Holcombe
3
qual é a diferença entre guias e scale_fill_discrete
Medhat
18
p$labels$fillnão funcionou para mim. Com ggplot2_2.1.0eu usop$labels$colour <- "New legend title"
ClementWalter 28/06
4
p$labels$fill é bom, mas se você estiver usando mais de uma variável em estética (tipo de linha, cor, forma) nos aes, precisará alterá-las para cada uma separadamente.
Discipulus
226

Eu não gostei muito disso, mas porque você usou fill = cond em ggplot (),

 + labs(color='NEW LEGEND TITLE') 

pode não ter funcionado. No entanto, você substitui a cor pelo preenchimento , funciona!

+ labs(fill='NEW LEGEND TITLE') 

Isso funcionou para mim no ggplot2_2.1.0

Rohan Sadale
fonte
20
Eu acho que essa é a resposta mais clara e direta, ela faz exatamente o que o OP pede com uma linha extra no máximo.
Leo
3
color = e fill = devem funcionar. Esta é a resposta "correta" para a pergunta, IMO
Dan
3
se a cor do preenchimento funcionará depende de qual "cond" (ou grupo em outros casos) é realmente mapeado. Uma boa explicação pode ser encontrada em cookbook-r.com/Graphs/Legends_(ggplot2)
user1442363
3
Esta é a melhor resposta.
Akshay Gaur
1
Nota: no ggplot2 3.0+, esta solução não funcionou: resolvida porp + guides(fill=guide_legend(title="New Legend Title"))
Sumanth Lazarus
39

Como você tem duas densidades, imagino que você queira definir suas próprias cores scale_fill_manual.

Se sim, você pode fazer:

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

legend_title <- "OMG My Title"

ggplot(df, aes(x=x, fill=group)) + geom_density(alpha=.3) +   
    scale_fill_manual(legend_title,values=c("orange","red"))

insira a descrição da imagem aqui

user1317221_G
fonte
27

Nenhum dos códigos acima funcionou para mim.

Aqui está o que eu encontrei e funcionou.

labs(color = "sale year")

Você também pode dar um espaço entre o título e a exibição adicionando \nno final.

labs(color = 'sale year\n")

Rohit Yadav
fonte
2
Como isso é diferente da resposta ?
merv
3
Sim, eu tentei todos os exemplos acima e este é o único que funcionou para mim. Obrigado!
SummerEla
Como esse trabalho, dada a pergunta original do post, parece que em fillvez de color(ou colour) é necessário? Dado o tempo da pergunta, é possível que esteja ggplot2relacionada à versão.
steveb 15/03
1
@merv A principal diferença é que este realmente funciona.
Luís de Sousa
16

Como no seu código você costumava ggplot(data, fill= cond)criar o histograma, você precisa adicionar o título da legenda usando também "fill" na seção do rótulo, por exemplo +labs(fill="Title name"). Se você estava usando um tipo diferente de plotagem em que o código era ggplot (data, cor = cond), você poderia usar +labs(colour= "Title Name"). Em resumo, o argumento do laboratório deve corresponder ao argumento aes.

Eu costumava + guides(fill=guide_legend("my awesome title"))alterar o título da legenda nos gráficos geom_bar, mas ele não parecia funcionar para geom_point.

kulianne
fonte
..., mas para geom_point(), isso funciona para mim:guides(color=guide_legend("Type:"))
knb 14/02
1
@knb, seu método funciona:guides(color=guide_legend("Score Ranking:"))
bmc
1
Como isso é diferente da resposta ?
merv
6

Há outra resposta muito simples que pode funcionar para alguns gráficos simples.

Basta adicionar uma chamada para guide_legend () no seu gráfico.

ggplot(...) + ... + guide_legend(title="my awesome title")

Como mostrado nos excelentes documentos do ggplot .

Se isso não funcionar, você pode definir com mais precisão os parâmetros do seu guia com uma chamada para guias :

ggplot(...) + ... + guides(fill=guide_legend("my awesome title"))

Você também pode variar a forma / cor / tamanho especificando esses parâmetros para a sua chamada guides.

Yourpalal
fonte
26
Isto não funcionou para mim, mas qplot(…) + guides(color=guide_legend(title="sale year"))funcionou
Arnaud A
3

Apenas para adicionar à lista (as outras opções aqui não funcionaram para mim), você também pode usar a função update_labels for ggplot:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
update_labels(p, list(colour="MY NEW LEGEND TITLE")

Isso também permitirá que você altere os rótulos dos eixos x e y, com linhas separadas:

update_labels(p, list(x="NEW X LABEL",y="NEW Y LABEL")
user3791304
fonte
2

Notei que existem duas maneiras de alterar / especificar legend.title para ggboxplot ():

library(ggpubr)

bxp.defaultLegend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                               color = "dose", palette = "jco")

# Solution 1, setup legend.title directly in ggboxplot()
bxp.legend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                 color = "dose", palette = "jco", legend.title="Dose (mg)")

# Solution 2: Change legend title and appearnace in ggboxplot() using labs() and theme() option:
plot1 <-  bxp.defaultLegend + labs(color = "Dose (mg)") +
  theme(legend.title = element_text(color = "blue", size = 10), legend.text = element_text(color = "red"))

ggarrange(list(bxp.legend, bxp.defaultLegend, plot1), nrow = 1, ncol = 3,  common.legend = TRUE)

O código é modificado com base no exemplo do GitHub .

Boa vontade
fonte
1

Estou usando um facet_wrap no meu ggplot e nenhuma das soluções sugeridas funcionou para mim, exceto a solução da ArnaudA:

qplot() + guides(color=guide_legend(title="sale year")) 
Birdonawire
fonte
1

Muitas pessoas passam muito tempo alterando rótulos, legendas, títulos e nomes do eixo porque não sabem que é possível carregar tabelas no R que contém espaços " ". No entanto, você pode fazer isso para economizar tempo ou reduzir o tamanho do seu código, especificando os separadores ao carregar uma tabela que, por exemplo, é delimitada por guias (ou qualquer outro separador que não seja o padrão ou um espaço único):

read.table(sep = '\t')

ou usando os parâmetros de carregamento padrão do formato csv:

read.csv()

Isso significa que você pode manter diretamente o nome "NEW LEGEND TITLE"como um nome de coluna (cabeçalho) no arquivo de dados original para evitar a especificação de um novo título de legenda em cada plot.

Nakx
fonte
-1

ggplot(df) + labs(legend = '<legend_title>')

Matthew Park
fonte