Як змінити назву легенди в 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.