Comment changer le titre d'une légende dans ggplot


300

J'ai l'intrigue suivante comme ci-dessous. Il a été créé avec cette commande:

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

Maintenant , la prochaine chose que je veux faire est de modifier le titre de la légende de cond en nouvelle légende TITRE .

Donc, ce que j'ai fait, c'est simplement d'ajouter la ligne suivante, ajoutez la fin du code ci-dessus:

+labs(colour="NEW LEGEND TITLE")

Mais ça ne marche pas. Quelle est la bonne façon de procéder?

entrez la description de l'image ici


110
labs(fill="xyz")devrait faire
baptiste

1
@baptiste Je suis revenu plusieurs fois sur cette question sans remarquer votre commentaire, pourriez-vous l'écrire comme réponse? OMI, c'est la solution la plus simple et mérite une certaine reconnaissance
User632716

3
@ User632716 c'est déjà dans la réponse de quelqu'un ci
baptiste

7
ça ne marche pas ...
shenglih

1
Pour ceux qui recherchent une réponse impliquant des parcelles avec plusieurs geom_déclarations, je recommande la réponse sur stackoverflow.com/a/38485985/1169233 , c'est la seule qui a fonctionné pour moi.
Waldir Leoncio

Réponses:


348

Cela devrait fonctionner:

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

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

10
Une autre alternative estp$labels$fill <- "New Legend Title"
Alex Holcombe

3
Quelle est la différence entre les guides et scale_fill_discrete
Medhat

18
p$labels$filln'a pas fonctionné pour moi. Avec ggplot2_2.1.0j'utilisep$labels$colour <- "New legend title"
ClementWalter

4
p$labels$fill est bien mais si vous utilisez plus d'une variable esthétique (type de ligne, couleur, forme) dans aes, vous devez les changer pour chacune séparément.
discipulus

226

Je n'y ai pas beaucoup creusé mais parce que vous avez utilisé fill = cond dans ggplot (),

 + labs(color='NEW LEGEND TITLE') 

pourrait ne pas avoir fonctionné. Cependant, si vous remplacez la couleur par le remplissage , cela fonctionne!

+ labs(fill='NEW LEGEND TITLE') 

Cela a fonctionné pour moi dans ggplot2_2.1.0


20
Je pense que c'est la réponse la plus simple, elle fait exactement ce que OP demande avec une ligne supplémentaire au plus
Leo

3
color = et fill = devraient fonctionner. Ceci est la "bonne" réponse à la question, OMI
Dan

3
si la couleur de remplissage fonctionnera dépend de ce que "cond" (ou groupe dans d'autres cas) est vraiment mappé. Une bonne explication peut être trouvée dans cookbook-r.com/Graphs/Legends_(ggplot2)
user1442363

3
C'est la meilleure réponse.
Akshay Gaur

1
Remarque: dans ggplot2 3.0+, cette solution ne fonctionnait pas: résolue parp + guides(fill=guide_legend(title="New Legend Title"))
Sumanth Lazarus

39

Puisque vous avez deux densités, j'imagine que vous voudrez peut-être définir vos propres couleurs avec scale_fill_manual.

Si oui, vous pouvez faire:

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

entrez la description de l'image ici


27

Aucun des codes ci-dessus n'a fonctionné pour moi.

Voici ce que j'ai trouvé et cela a fonctionné.

labs(color = "sale year")

Vous pouvez également donner un espace entre le titre et l'affichage en ajoutant \nà la fin.

labs(color = 'sale year\n")


2
En quoi est-ce différent de cette réponse ?
merv

3
Oui, j'ai essayé tous les exemples ci-dessus et c'est le seul qui a fonctionné pour moi. Merci!
SummerEla

Comment ce travail serait-il donné la question d'origine du post, il semble qu'au filllieu de color(ou colour) est nécessaire? Compte tenu de l'heure de la question, il est possible qu'elle soit ggplot2liée à la version.
steveb

1
@merv La principale différence est que celui-ci fonctionne réellement.
Luís de Sousa

16

Étant donné que dans votre code, vous avez utilisé ggplot(data, fill= cond)pour créer l'histogramme, vous devez ajouter le titre de la légende en utilisant également "remplir" dans la section d'étiquette, c'est-à-dire +labs(fill="Title name"). Si vous utilisiez un type de tracé différent où le code était ggplot (data, color = cond), alors vous pourriez utiliser +labs(colour= "Title Name"). En résumé, l'argument lab doit correspondre à l'argument aes.

J'ai l'habitude + guides(fill=guide_legend("my awesome title"))de changer le titre de la légende sur les tracés geom_bar mais cela ne semble pas fonctionner pour geom_point.


..., mais pour geom_point(), cela fonctionne pour moi:guides(color=guide_legend("Type:"))
knb

1
@knb, votre méthode fonctionne:guides(color=guide_legend("Score Ranking:"))
bmc

1
En quoi est-ce différent de cette réponse ?
merv

6

Il existe une autre réponse très simple qui peut fonctionner pour certains graphiques simples.

Ajoutez simplement un appel à guide_legend () dans votre graphique.

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

Comme le montrent les très beaux documents ggplot .

Si cela ne fonctionne pas, vous pouvez définir plus précisément les paramètres de votre guide avec un appel aux guides :

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

Vous pouvez également faire varier la forme / couleur / taille en spécifiant également ces paramètres pour votre appel guides.


26
Cela n'a pas fonctionné pour moi, mais a qplot(…) + guides(color=guide_legend(title="sale year"))fonctionné
Arnaud A

3

Juste pour ajouter à la liste (les autres options ici ne fonctionnaient pas pour moi), vous pouvez également utiliser la fonction update_labels pour 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")

Cela vous permettra également de modifier les étiquettes des axes x et y, avec des lignes distinctes:

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

2

J'ai remarqué qu'il y a deux façons de changer / spécifier legend.title pour 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)

Le code est modifié sur la base de l' exemple de GitHub .


1

J'utilise un facet_wrap dans mon ggplot et aucune des solutions suggérées n'a fonctionné pour moi, sauf la solution d'ArnaudA:

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

1

Beaucoup de gens passent beaucoup de temps à changer les étiquettes, les étiquettes de légende, les titres et les noms des axes car ils ne savent pas qu'il est possible de charger des tables dans R contenant des espaces " ". Vous pouvez cependant le faire pour gagner du temps ou réduire la taille de votre code, en spécifiant les séparateurs lorsque vous chargez une table par exemple délimitée par des tabulations (ou tout autre séparateur que par défaut ou un seul espace):

read.table(sep = '\t')

ou en utilisant les paramètres de chargement par défaut du format csv:

read.csv()

Cela signifie que vous pouvez conserver directement le nom en "NEW LEGEND TITLE"tant que nom de colonne (en-tête) dans votre fichier de données d'origine pour éviter de spécifier un nouveau titre de légende dans chaque tracé.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.