Як змінити назву легенди в ggplot


299

У мене такий сюжет, як нижче. Він був створений за допомогою цієї команди:

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 в НОВИЙ ЗАГАЛЬНИЙ ЛЕГЕНД .

Отже, що я зробив, це просто додати наступний рядок і додати кінець вищевказаного коду:

+labs(colour="NEW LEGEND TITLE")

Але це не працює. Який правильний спосіб це зробити?

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


110
labs(fill="xyz")повинен робити
— баптист

1
@baptiste Я неодноразово повертався до цього питання, не помічаючи ваших коментарів, чи можете ви написати це як відповідь? IMO - це найпростіше рішення і заслуговує певного визнання
— User632716

3
@ User632716 це вже в чиїйсь відповіді нижче
— baptiste

7
це не працює ...
— shenglih

1
Для тих, хто шукає відповідь на сюжети з декількома geom_заявами, я рекомендую відповідь на сайті stackoverflow.com/a/38485985/1169233 , це єдиний, хто працював на мене.
— Вальдір Леонсіо

Відповіді:


347

Це має працювати:

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
— Медхат

18
p$labels$fillне працювало для мене. З ggplot2_2.1.0I використовуватиp$labels$colour <- "New legend title"
— ClementWalter

4
p$labels$fill Це приємно, але якщо ви використовуєте більше, ніж одну змінну в естетичному (лінійний тип, колір, форму) в аес, вам доведеться змінити їх для кожної окремо.
— дисципліна

226

Я не дуже багато в цьому розбирався, а тому, що ви використовували fill = cond в ggplot (),

 + labs(color='NEW LEGEND TITLE') 

можливо, не спрацювало. Однак ви заміните колір на заливку , це працює!

+ labs(fill='NEW LEGEND TITLE') 

Це працювало для мене в ggplot2_2.1.0


20
Я думаю, що це найпростіша відповідь, вона робить саме те, що вимагає ОП, максимум з однією додатковою лінією
— Лев

3
і колір = і заливка = повинні працювати. Це "правильна" відповідь на запитання, IMO
— Dan

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

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 Основна відмінність полягає в тому, що цей насправді працює.
— Luís de Sousa

16

Оскільки у своєму коді ви використовували ggplot(data, fill= cond)для створення гістограми, вам потрібно додати назву легенди, також використовуючи "заповнити" в розділі мітки, тобто +labs(fill="Title name"). Якщо ви використовували інший тип сюжету, де код був ggplot (дані, 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:"))
— кнб

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"))працювало
— Арно А

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.