Come cambiare il titolo della legenda in ggplot


300

Ho la seguente trama come di seguito. È stato creato con questo 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")

Ora la prossima cosa che voglio fare è modificare il titolo della legenda da cond in NEW LEGEND TITLE .

Quindi quello che ho fatto è solo aggiungere la seguente riga aggiungere la fine del codice sopra:

+labs(colour="NEW LEGEND TITLE")

Ma non funziona Qual è il modo giusto per farlo?

inserisci qui la descrizione dell'immagine


110
labs(fill="xyz")dovrebbe fare
battezzare il

1
@baptiste Sono tornato a questa domanda numerose volte senza notare il tuo commento, potresti scriverlo come risposta? IMO è la soluzione più semplice e merita un riconoscimento
User632716,

3
@ User632716 è già nella risposta di qualcuno qui sotto
baptiste il

7
non funziona ...
shenglih

1
Per coloro che cercano una risposta che coinvolga trame con più geom_dichiarazioni, raccomando la risposta su stackoverflow.com/a/38485985/1169233 , è l'unica che ha funzionato per me.
Waldir Leoncio,

Risposte:


348

Questo dovrebbe funzionare:

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

(o in alternativa)

p + scale_fill_discrete(name = "New Legend Title")

10
Un'altra alternativa èp$labels$fill <- "New Legend Title"
Alex Holcombe,

3
qual è la differenza tra guide e scale_fill_discrete
Medhat

18
p$labels$fillnon ha funzionato per me. Con ggplot2_2.1.0usop$labels$colour <- "New legend title"
ClementWalter il

4
p$labels$fill è bello ma se stai usando più di una variabile in estetica (tipo di linea, colore, forma) in aes, devi cambiarle per ognuna separatamente.
Discepolo

226

Non ho approfondito molto in questo, ma poiché hai usato fill = cond in ggplot (),

 + labs(color='NEW LEGEND TITLE') 

potrebbe non aver funzionato. Tuttavia, sostituisci il colore con il riempimento , funziona!

+ labs(fill='NEW LEGEND TITLE') 

Questo ha funzionato per me in ggplot2_2.1.0


20
Penso che questa sia la risposta più rigorosa, fa esattamente quello che OP richiede con una linea in più
Leo

3
sia color = che fill = dovrebbero funzionare. Questa è la risposta "giusta" alla domanda, IMO
Dan

3
il funzionamento del colore di riempimento dipende da quale "cond" (o gruppo in altri casi) è realmente mappato. Una buona spiegazione potrebbe essere trovata in cookbook-r.com/Graphs/Legends_(ggplot2)
user1442363

3
Questa è la risposta migliore
Akshay Gaur,

1
Nota: in ggplot2 3.0+ questa soluzione non ha funzionato: risolto dap + guides(fill=guide_legend(title="New Legend Title"))
Sumanth Lazarus

39

Dato che hai due densità, immagino che potresti voler impostare i tuoi colori con scale_fill_manual.

Se è così puoi fare:

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

inserisci qui la descrizione dell'immagine


27

Nessuno dei codici sopra ha funzionato per me.

Ecco cosa ho trovato e ha funzionato.

labs(color = "sale year")

Puoi anche dare uno spazio tra il titolo e il display aggiungendo \nalla fine.

labs(color = 'sale year\n")


2
In che modo è diverso da questa risposta ?
Merv

3
Sì, ho provato ogni singolo esempio sopra e questo è l'unico che ha funzionato per me. Grazie!
SummerEla,

In che modo questo lavoro, data la domanda post originale, sembra che fillinvece di color(o colour) sia necessario? Dato il tempo della domanda, è possibile che sia ggplot2correlato alla versione.
steveb

1
@merv La differenza principale è che questa funziona davvero.
Luís de Sousa il

16

Dato che nel tuo codice hai usato ggplot(data, fill= cond)per creare l'istogramma devi aggiungere il titolo della legenda usando anche "riempi" nella sezione etichetta, ad es +labs(fill="Title name"). Se stavi usando un diverso tipo di trama in cui il codice era ggplot (data, color = cond), allora potresti usare +labs(colour= "Title Name"). In sintesi, l'argomento lab deve corrispondere all'argomento aes.

Ho usato + guides(fill=guide_legend("my awesome title"))per cambiare il titolo della legenda sui grafici geom_bar ma non sembrava funzionare per geom_point.


..., ma per geom_point(), questo funziona per me:guides(color=guide_legend("Type:"))
Knb

1
@knb, il tuo metodo funziona:guides(color=guide_legend("Score Ranking:"))
bmc

1
In che modo è diverso da questa risposta ?
Merv

6

C'è un'altra risposta molto semplice che può funzionare per alcuni semplici grafici.

Aggiungi una chiamata a guide_legend () nel tuo grafico.

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

Come mostrato negli ottimi documenti di ggplot .

Se il problema persiste, puoi impostare con maggiore precisione i parametri della tua guida con una chiamata alle guide :

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

Puoi anche variare forma / colore / dimensione specificando questi parametri anche per la tua chiamata guides.


26
Questo non ha funzionato per me, ma ha qplot(…) + guides(color=guide_legend(title="sale year"))funzionato
Arnaud,

3

Solo per aggiungere all'elenco (le altre opzioni qui non hanno funzionato per me), puoi anche usare la funzione update_labels per 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")

Ciò consentirà anche di modificare le etichette degli assi X e Y, con linee separate:

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

2

Ho notato che ci sono due modi per cambiare / specificare legend.title per 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)

Il codice viene modificato in base all'esempio di GitHub .


1

Sto usando un facet_wrap nel mio ggplot e nessuna delle soluzioni suggerite ha funzionato per me tranne la soluzione di ArnaudA:

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

1

Molte persone impiegano molto tempo a cambiare etichette, etichette delle legende, titoli e nomi degli assi perché non sanno che è possibile caricare tabelle in R che contengono spazi " ". Puoi tuttavia farlo per risparmiare tempo o ridurre le dimensioni del tuo codice, specificando i separatori quando carichi una tabella che è ad esempio delimitata da tabulazioni (o qualsiasi altro separatore diverso da quello predefinito o un singolo spazio):

read.table(sep = '\t')

o utilizzando i parametri di caricamento predefiniti del formato CSV:

read.csv()

Ciò significa che è possibile mantenere direttamente il nome "NEW LEGEND TITLE"come nome di colonna (intestazione) nel file di dati originale per evitare di specificare un nuovo titolo di legenda in ogni trama.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.