Удалить легенду ggplot 2.2

251

Я пытаюсь сохранить легенду одного слоя (гладкую) и удалить легенду другого (точка). Я пытался отключить легенды с guides(colour = FALSE)и geom_point(aes(color = vs), show.legend = FALSE).

Изменить : Поскольку этот вопрос и его ответы популярны, воспроизводимый пример выглядит по порядку:

library(ggplot2)
ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

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

парень
источник
5
Минимальный воспроизводимый пример был бы намного проще. В длинной строке кода, по-видимому, содержится много ненужного (для рассматриваемой проблемы) кода, а также он полностью невоспроизводим, как он написан в настоящее время.
mnel
Возможный дубликат выключения некоторых легенд на ggplot
Umaomamaomao

Ответы:

446

из поваренной книги , где bp - ваш ggplot:

Удалить легенду для определенной эстетики (заполнить):

bp + guides(fill=FALSE)

Это также можно сделать при указании масштаба:

bp + scale_fill_discrete(guide=FALSE)

Это удаляет все легенды:

bp + theme(legend.position="none")
user3490026
источник
25
В ответ на комментарий @Alex: обратите внимание, что это theme_bw()может помешать любым определениям, сделанным с использованием theme(). При использовании theme_bw()обязательно добавьте его в график, прежде чем изменять какие-либо другие параметры темы.
Фаберн
1
но когда я делаю что-то подобное bp + theme(legend.position="none") + theme_classic(), легенды возвращаются. Так как это убрать?
loveR
3
@loveR поставил theme_classic первым:bp + theme_classic() + theme(legend.position="none")
гипотеза
1
Это не повлияло на мой сюжет. Я успешно использовал подход @Tjebo.
Джеймс Хиршорн
80

Там может быть другое решение этого:
Ваш код был:

geom_point(aes(..., show.legend = FALSE))

Вы можете указать show.legendпараметр после по aesвызову:

geom_point(aes(...), show.legend = FALSE)

тогда соответствующая легенда должна исчезнуть

Tjebo
источник
3
Это очень хороший подход. Более интуитивно понятен.
PatL
2
Это было решение, которое работало для удаления букв из легенды, когда я использовал geom_text, чтобы комментировать строки в цвете. Там нет scale_labelкоманды (и это не имеет смысла), а guide(label = FALSE)также не работает. Спасибо!
Мелисса Ки
45

Поскольку вопрос и ответ пользователя 3490026 являются популярным поисковым хитом, я привел воспроизводимый пример и краткую иллюстрацию выдвинутых на данный момент предложений, а также решение, которое явно касается вопроса ОП.

Одна из вещей, которая ggplot2делает и которая может сбивать с толку, - это то, что она автоматически смешивает определенные легенды, когда они связаны с одной и той же переменной. Например, factor(gear)появляется дважды, один раз linetypeи один раз fill, что приводит к объединенной легенде. В отличие от этого, gearимеет собственную запись легенды, поскольку она не рассматривается так же, как factor(gear). Предлагаемые решения обычно работают хорошо. Но иногда вам может понадобиться переопределить направляющие. Смотрите мой последний пример внизу.

# reproducible example:
library(ggplot2)
p <- ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

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

Удалить все легенды: @ user3490026

p + theme(legend.position = "none")

Удалить все легенды: @duhaime

p + guides(fill = FALSE, color = FALSE, linetype = FALSE, shape = FALSE)

Отключить легенды: @Tjebo

ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs), show.legend = FALSE) +
geom_point(aes(shape = factor(cyl)), show.legend = FALSE) +
geom_line(aes(linetype = factor(gear)), show.legend = FALSE) +
geom_smooth(aes(fill = factor(gear), color = gear), show.legend = FALSE) + 
theme_bw() 

Удалите заливку, чтобы тип линии стал видимым

p + guides(fill = FALSE)

То же, что и выше, с помощью функции scale_fill_:

p + scale_fill_discrete(guide = FALSE)

А теперь один возможный ответ на запрос ОП

«сохранить легенду одного слоя (гладкой) и удалить легенду другого (точки)»

Включите некоторые из некоторых специальных пост-hoc

p + guides(fill = guide_legend(override.aes = list(color = NA)), 
           color = FALSE, 
           shape = FALSE)  

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

PatrickT
источник
2
Просто заметил, что синий цвет заливки на последнем графике не появляется на графике, не уверен, почему ...
PatrickT
Введите warnings()после того, как вы запустили свой код, и вы увидите причины, по которым синяя лента не появляется.
Маркус
@ Markus: Понял, спасибо! Я не буду редактировать пример, так как проблема отдельная. Однако нет смысла иметь легенду, seкогда она не вычисляется. Вероятно, стоит того, чтобы на github, но у меня сейчас нет энергии ...
PatrickT
13

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

+ guides(fill=FALSE, color=FALSE)
duhaime
источник