Usuń legendę ggplot 2.2

250

Staram się zachować legendę jednej warstwy (gładką) i usunąć legendę drugiej (punkt). Próbowałem zamknąć legendy za pomocą guides(colour = FALSE)i geom_point(aes(color = vs), show.legend = FALSE).

Edycja : Ponieważ to pytanie i odpowiedzi są popularne, powtarzalny przykład wydaje się w kolejności:

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

wprowadź opis zdjęcia tutaj

Chłopak
źródło
5
Minimalny, powtarzalny przykład byłby o wiele prostszy. W długim wierszu kodu wydaje się, że jest dużo niepotrzebnego (dla aktualnego problemu) kodu, a także że jest on całkowicie nie do odtworzenia, jak jest obecnie napisany.
mnel
Możliwy duplikat wyłączania niektórych legend w ggplot
Umaomamaomao

Odpowiedzi:

445

z książki kucharskiej r , gdzie bp to twój ggplot:

Usuń legendę dla określonej estetyki (wypełnienia):

bp + guides(fill=FALSE)

Można to również zrobić przy określaniu skali:

bp + scale_fill_discrete(guide=FALSE)

To usuwa wszystkie legendy:

bp + theme(legend.position="none")
użytkownik3490026
źródło
25
W odpowiedzi na komentarz @Alex: Uwaga: theme_bw()może zakłócać wszelkie definicje wykonane przy użyciu theme(). Podczas używania theme_bw()pamiętaj, aby dodać go do fabuły, zanim zmienisz inne opcje motywu.
fabern
1
ale kiedy robię coś takiego bp + theme(legend.position="none") + theme_classic(), legendy wracają. Jak to usunąć?
loveR
3
@loveR umieścił theme_classic na pierwszym miejscu:bp + theme_classic() + theme(legend.position="none")
hipoteza
1
Nie miało to wpływu na moją fabułę. Z powodzeniem zastosowałem podejście @Tjebo.
James Hirschorn
80

Może być na to inne rozwiązanie:
Twój kod to:

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

Można określić show.legendparametr po tej aesrozmowy:

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

odpowiednia legenda powinna zniknąć

Tjebo
źródło
3
To bardzo miłe podejście. Bardziej intuicyjny.
patL
2
To było rozwiązanie, które działało w celu usunięcia liter z legendy, gdy użyłem geom_text do opisania kolorowych linii. Nie ma scale_labelpolecenia (ani nie ma to sensu), a guide(label = FALSE)także nie działało. Dzięki!
Melissa Key
45

Ponieważ pytanie i odpowiedź użytkownika 3490026 są hitem wyszukiwania, podałem powtarzalny przykład i krótką ilustrację dotychczasowych sugestii wraz z rozwiązaniem, które wyraźnie odnosi się do pytania PO.

Jedną z rzeczy, które działają ggplot2i mogą być mylące, jest to, że automatycznie łączy pewne legendy, gdy są one powiązane z tą samą zmienną. Na przykład factor(gear)pojawia się dwa razy, raz za linetypei raz za fill, co daje połączoną legendę. Natomiast gearma własną pozycję legendy, ponieważ nie jest traktowana tak samo jak factor(gear). Dotychczasowe rozwiązania zwykle działają dobrze. Ale czasami może być konieczne zastąpienie przewodników. Zobacz mój ostatni przykład na dole.

# 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() 

wprowadź opis zdjęcia tutaj

Usuń wszystkie legendy: @ user3490026

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

Usuń wszystkie legendy: @duhaime

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

Wyłącz legendy: @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() 

Usuń wypełnienie, aby widoczny był rodzaj linii

p + guides(fill = FALSE)

To samo co powyżej za pomocą funkcji scale_fill_:

p + scale_fill_discrete(guide = FALSE)

A teraz jedna możliwa odpowiedź na prośbę PO

„aby zachować legendę jednej warstwy (gładką) i usunąć legendę drugiej (punkt)”

Włącz niektóre, wyłączając ad-hoc post-hoc

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

wprowadź opis zdjęcia tutaj

PatrickT
źródło
2
Zauważyłem, że niebieski kolor wypełnienia na ostatnim wykresie nie pojawia się na wykresie, nie jestem pewien, dlaczego ...
PatrickT
Wpisz tekst warnings()po uruchomieniu kodu, a zobaczysz przyczynę, dla której niebieska wstążka się nie wyświetla.
markus
@markus: Mam to dzięki! Nie zawracam sobie głowy edycją przykładu, ponieważ problem jest osobny. Jednak nie ma sensu mieć legendy, segdy nie jest obliczana. Prawdopodobnie warte problemu w github, ale teraz nie mam energii ...
PatrickT
13

Jeśli Twój wykres wykorzystuje zarówno estetykę, jak filli colorestetykę, możesz usunąć legendę za pomocą:

+ guides(fill=FALSE, color=FALSE)
duhaime
źródło