Как изменить заголовок легенды в ggplot


300

У меня есть следующий сюжет, как показано ниже. Он был создан с помощью этой команды:

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

Теперь я хочу изменить название легенды из cond на NEW LEGEND TITLE .

Итак, я просто добавил следующую строку и добавил конец приведенного выше кода:

+labs(colour="NEW LEGEND TITLE")

Но это не работает. Какой правильный способ сделать это?

введите описание изображения здесь


110
labs(fill="xyz")должен сделать
крестить

1
@baptiste Я возвращался к этому вопросу несколько раз, не замечая вашего комментария, не могли бы вы написать его в качестве ответа? ИМО это самое простое решение и заслуживает некоторого признания
User632716

3
@ User632716 это уже в чьем - то ответ ниже
Батист

7
это не работает ...
Шенглих

1
Для тех, кто ищет ответ, включающий графики с несколькими geom_утверждениями, я рекомендую ответ на stackoverflow.com/a/38485985/1169233 , он единственный, который работал для меня.
Вальдир Леонсио

Ответы:


348

Это должно работать:

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

(или альтернативно)

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

10
Другая альтернативаp$labels$fill <- "New Legend Title"
Алекс Холкомб

3
В чем разница между направляющими и scale_fill_discrete
Medhat

18
p$labels$fillне работал для меня С ggplot2_2.1.0я используюp$labels$colour <- "New legend title"
ClementWalter

4
p$labels$fill это хорошо, но если вы используете более одной переменной в эстетике (тип линии, цвет, форма) в aes, вы должны изменить их для каждой отдельно.
ученик

226

Я не слишком углубился в это, но потому что вы использовали fill = cond в ggplot (),

 + labs(color='NEW LEGEND TITLE') 

возможно, не сработало. Однако вы замените цвет на заливку , это работает!

+ labs(fill='NEW LEGEND TITLE') 

Это сработало для меня в ggplot2_2.1.0


20
Я думаю, что это самый верный ответ, он делает именно то, о чем просит OP, но не более чем с одной дополнительной строкой
Лев

3
оба цвета = и заполнить = должны работать. Это «правильный» ответ на вопрос, ИМО
Дан

3
будет ли работать цвет заливки, зависит от того, на что действительно наложен «cond» (или группа в других случаях). Хорошее объяснение можно найти в cookbook-r.com/Graphs/Legends_(ggplot2)
user1442363

3
Это лучший ответ.
Акшай Гаур

1
Примечание: в ggplot2 3.0+ это решение не работало: решено с помощьюp + guides(fill=guide_legend(title="New Legend Title"))
Sumanth Lazarus

39

Так как у вас есть две плотности, я думаю, вы, возможно, захотите установить свои собственные цвета с scale_fill_manual .

Если это так, вы можете сделать:

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

введите описание изображения здесь


27

Ни один из приведенных выше кодов не работает для меня.

Вот что я нашел и это сработало.

labs(color = "sale year")

Вы также можете оставить пробел между заголовком и дисплеем, добавив \nв конце.

labs(color = 'sale year\n")


2
Чем это отличается от этого ответа ?
Merv

3
Да, я попробовал каждый пример выше, и это единственный, который работал для меня. Спасибо!
SummerEla

Как бы эта работа с учетом исходного поста вопроса, похоже, fillвместо color(или colour) нужна? Учитывая время вопроса, возможно, это связано с ggplot2версией.
Steveb

1
@merv Главное отличие в том, что этот действительно работает.
Луис де Соуза

16

Поскольку в вашем коде вы использовали ggplot(data, fill= cond)для создания гистограммы вам нужно добавить заголовок легенды также при помощи «заливки» в разделе этикетки , т.е. +labs(fill="Title name"). Если вы использовали другой тип графика, где код был ggplot (data, color = cond), то вы можете использовать +labs(colour= "Title Name"). Таким образом, лабораторный аргумент должен соответствовать аргументу aes.

Я использовал + guides(fill=guide_legend("my awesome title"))для изменения заголовка легенды на графиках geom_bar, но он не работал для geom_point.


..., но для geom_point()меня это работает:guides(color=guide_legend("Type:"))
knb

1
@knb, твой метод работает:guides(color=guide_legend("Score Ranking:"))
bmc

1
Чем это отличается от этого ответа ?
Merv

6

Есть еще один очень простой ответ, который может работать для некоторых простых графиков.

Просто добавьте вызов guide_legend () в свой график.

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

Как показано в очень хороших документах ggplot .

Если это не сработает, вы можете более точно установить параметры вашего гида с помощью вызова гида :

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

Вы также можете изменить форму / цвет / размер, указав эти параметры для вашего вызова guides.


26
Это не сработало для меня, но qplot(…) + guides(color=guide_legend(title="sale year"))сработало
Arnaud A

3

Просто чтобы добавить в список (другие опции здесь не работали для меня), вы также можете использовать функцию update_labels для 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")

Это также позволит вам изменять метки по осям X и Y отдельными строками:

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

2

Я заметил, что есть два способа изменить / указать legend.title для 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)

Код модифицируется на основе примера из GitHub .


1

Я использую facet_wrap в своем ggplot, и ни одно из предложенных решений не сработало для меня, кроме решения ArnaudA:

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

1

Многие люди тратят много времени на изменение меток, меток легенд, заголовков и названий оси, потому что они не знают, что в R можно загрузить таблицы с пробелами " ". Однако вы можете сделать это, чтобы сэкономить время или уменьшить размер вашего кода, указав разделители при загрузке таблицы, которая, например, разделена вкладками (или любым другим разделителем, отличным от значения по умолчанию, или одним пробелом):

read.table(sep = '\t')

или используя параметры загрузки по умолчанию в формате csv:

read.csv()

Это означает, что вы можете напрямую сохранить имя "NEW LEGEND TITLE"в качестве имени столбца (заголовка) в исходном файле данных, чтобы избежать указания нового заголовка легенды на каждом графике.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.