Usuń dodatkowe legendy w ggplot2

91

Mam prostą ramkę danych, którą próbuję wykonać za pomocą połączonego wykresu linii i punktów ggplot2. Przypuśćmy, że moje dane wyglądają tak:

df <- data.frame(x=rep(1:10,2), y=c(1:10,11:20), 
                 group=c(rep("a",10),rep("b",10)))

I próbuję ułożyć fabułę:

g <- ggplot(df, aes(x=x, y=y, group=group))
g <- g + geom_line(aes(colour=group))
g <- g + geom_point(aes(colour=group, alpha = .8))
g

Wynik wygląda dobrze z jednym wyjątkiem. Ma dodatkową legendę pokazującą alphamoją geom_pointwarstwę.

Dodatkowa legenda o przezroczystości <code> geom_point </code>

Jak mogę zachować legendę pokazującą kolory grup, ale nie tę, która pokazuje moje ustawienia alfa?

Wilduck
źródło

Odpowiedzi:

172

Estetykę można ustawić lub odwzorować w trakcie ggplotrozmowy.

  • Estetyka zdefiniowana wewnątrz aes(...)jest odwzorowywana na podstawie danych i tworzona jest legenda.
  • Estetyczny może być również ustawiony na wartość pojedynczego, definiując ją na zewnątrz aes().

W takim przypadku wydaje się, że chcesz ustawić alpha = 0.8 i zmapować colour = group .

Aby to zrobić,

Umieść alpha = 0.8poza aes()definicją.

g <- ggplot(df, aes(x = x, y = y, group = group))
g <- g + geom_line(aes(colour = group))
g <- g + geom_point(aes(colour = group), alpha = 0.8)
g

wprowadź opis obrazu tutaj

Dla każdej zmapowanej zmiennej można ukryć wygląd legendy, używając guide = 'none'w odpowiednim scale_...wywołaniu. na przykład.

g2 <- ggplot(df, aes(x = x, y = y, group = group)) + 
        geom_line(aes(colour = group)) +
        geom_point(aes(colour = group, alpha = 0.8))
g2 + scale_alpha(guide = 'none')

Który zwróci identyczną fabułę

Komentarz EDIT @ Joran jest trafny, moja odpowiedź była bardziej wyczerpująca

mnel
źródło
18
Jest to właściwa metoda, ponieważ OP raczej ustawia niż odwzorowuje estetykę, ale ogólnie można ukryć wygląd dowolnej legendy za pomocą czegoś podobnego g + scale_alpha(guide = "none").
joran
W rzeczy samej. Odpowiedź została szczegółowo omówiona. Bardziej sensowne jest posiadanie kompleksowej odpowiedzi, nie tylko specyficznej dla kwestii PO.
mnel
4
Dziękuję bardzo za dodatkowe wyjaśnienie. To bardzo pomaga mi zrozumieć filozofię ggplot.
Wilduck
2
Używam ggplot od ponad roku i NIGDY nie rozumiałem różnicy między zmapowaną lub ustawioną zmienną. To zdecydowanie najlepsza odpowiedź SO, jaką kiedykolwiek widziałem, gratulacje.
Amit Kohli
1
@theforestecologist To dlatego, że groupestetyka sama w sobie nie generuje żadnych skal ani wskazówek. To zawsze coś w rodzaju modyfikowania czegoś innego. Nigdy nie zdobędziesz legendy o estetyce „grupowej”.
joran
41

Po prostu dodaj show.legend = Fkod po części, w której go nie chcesz.

g <- ggplot(df, aes(x=x, y=y, group=group))
g <- g + geom_line(aes(colour=group))
g <- g + geom_point(aes(colour=group, alpha = .8), show.legend = F)
CSV
źródło
1
Jest to o wiele bardziej intuicyjne niż mapowanie w porównaniu z estetyką ustawiania (chociaż to
wyjaśnia
1

W przypadku starszych wersji ggplot2 (wersje wcześniejsze niż 0.9.2, wydane pod koniec 2012 r.) Ta odpowiedź powinna działać:

Próbowałem tego z a colour_scalei nie zadziałało. Wygląda na to, że colour_scale_hueelement działa jak funkcja z domyślnym parametrem TRUE. Dodałem scale_colour_hue(legend=FALSE)i zadziałało.

Nie jestem pewien, czy tak jest w przypadku wszystkich pozycji w skali kolorów w ggplot

Żorżeta
źródło
3
Używanie legendw scale_*rozmowie jest przestarzałe, lepiej to zrobić scale_colour_hue(guide = "none").
Gregor Thomas
3
biorąc pod uwagę, że legend=FALSEjest przestarzały, jak wskazał komentarz @shujaa, jest to w rzeczywistości zduplikowana odpowiedź, tj. dodanie guide = "none"do scale_fill/color*funkcji.
David LeBauer