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

156

Я пытаюсь сохранить легенду о одном слое (плавно) и удалить легенду другого (точки). Я попытался отключить легенды с помощью 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() 

Изображение 298

  • 4
    Минимальный воспроизводимый пример был бы намного проще. В длинной строке кода, по-видимому, содержится много ненужного (для рассматриваемой проблемы) кода, а также он совершенно невоспроизводим, как он написан в настоящее время.
  • 0
    Возможный дубликат выключения некоторых легенд на ggplot
Теги:
ggplot2
legend

4 ответа

341

из r cookbook, где bp - ваш ggplot:

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

bp + guides(fill=FALSE)

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

bp + scale_fill_discrete(guide=FALSE)

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

bp + theme(legend.position="none")
  • 18
    В ответ на комментарий @Alex: обратите внимание, что theme_bw() может мешать любым определениям, выполненным с помощью theme() . При использовании theme_bw() обязательно добавьте его в график, прежде чем изменять какие-либо другие параметры темы.
40

Это может быть другое:
Ваш код:

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

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

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

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

  • 1
    Это очень хороший подход. Более интуитивно понятен.
10

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

+ guides(fill=FALSE, color=FALSE)
2

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

Одна из вещей, которые делает 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() 

Изображение 4362

Удалить все легенды: @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)

И теперь один возможный ответ на запрос OP

"сохранить легенду о одном слое (гладко) и удалить легенду о другой (точке)",

Поверните некоторые на некоторых внеочередных

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

Изображение 4363

  • 2
    Просто заметил, что синий цвет заливки на последнем графике не появляется на графике, не знаю почему ...
  • 0
    Напечатайте warnings() после того, как вы запустили свой код, и вы увидите причины, по которым голубая лента не появляется.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню