Entfernen Sie zusätzliche Legenden in ggplot2

88

Ich habe einen einfachen Datenrahmen, mit dem ich ein kombiniertes Linien- und Punktdiagramm erstellen möchte ggplot2. Angenommen, meine Daten sehen folgendermaßen aus:

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

Und ich versuche eine Handlung zu machen:

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

Das Ergebnis sieht mit einer Ausnahme gut aus. Es gibt eine zusätzliche Legende, die die alphafür meine geom_pointEbene zeigt.

Zusätzliche Legende für <code> geom_point </ code> Transparenz

Wie kann ich die Legende beibehalten, die Gruppenfarben anzeigt, aber nicht die, die meine Alpha-Einstellungen anzeigt?

Wilduck
quelle

Antworten:

168

Die Ästhetik kann innerhalb eines Anrufs festgelegt oder zugeordnet werden ggplot.

  • Ein ästhetisches definierte innerhalb aes(...)ist kartiert aus den Daten und eine Legende geschaffen.
  • Ein ästhetisches kann auch werden , eingestellt auf einen einzigen Wert, indem sie sie außerhalb definieren aes().

In diesem Fall möchten Sie anscheinend festlegen alpha = 0.8 und zuordnen colour = group .

Um dies zu tun,

Platzieren Sie die alpha = 0.8Außenseite der aes()Definition.

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

Geben Sie hier die Bildbeschreibung ein

Für jede zugeordnete Variable können Sie das Erscheinungsbild einer Legende unterdrücken, indem Sie sie guide = 'none'im entsprechenden scale_...Aufruf verwenden. z.B.

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

Welches wird eine identische Handlung zurückgeben

Der Kommentar von EDIT @ Joran ist genau richtig, ich habe meine Antwort umfassender gemacht

mnel
quelle
18
Dies ist die richtige Methode, da das OP eine Ästhetik einstellt, anstatt sie abzubilden. Im Allgemeinen können Sie jedoch das Auftreten einer Legende mit so etwas wie unterdrücken g + scale_alpha(guide = "none").
Joran
Tatsächlich. Die Antwort wurde ausgearbeitet. Es ist sinnvoller, eine umfassende Antwort zu haben, die nicht nur auf das OP-Problem zugeschnitten ist.
mnel
4
Vielen Dank für die zusätzliche Erklärung. Dies trägt wesentlich dazu bei, die Philosophie von ggplot zu verstehen.
Wilduck
2
Ich benutze ggplot seit über einem Jahr und habe den Unterschied zwischen einer zugeordneten oder einer gesetzten Variablen NIE verstanden. Dies ist bei weitem die beste SO-Antwort, die ich je gesehen habe, herzlichen Glückwunsch.
Amit Kohli
1
@theforestecologist Das liegt daran, dass die groupÄsthetik selbst keine Skalen oder Anleitungen erzeugt. Es ist immer eine Art, etwas anderes zu modifizieren. Sie werden nie eine Legende für die "Gruppen" -Ästhetik bekommen.
Joran
38

Fügen Sie einfach den show.legend = FCode nach dem Teil hinzu, an dem Sie ihn nicht möchten.

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
quelle
1
Dies ist viel intuitiver als Mapping vs. Setting-Ästhetik (obwohl dies auch viele Missverständnisse
beseitigt
1

Für alte Versionen von ggplot2 (Versionen vor 0.9.2, veröffentlicht Ende 2012) sollte diese Antwort funktionieren:

Ich habe es mit einem versucht colour_scaleund es hat nicht funktioniert. Es scheint, dass das colour_scale_hueElement wie eine Funktion mit einem Standardparameter funktioniert TRUE. Ich fügte hinzu scale_colour_hue(legend=FALSE)und es funktionierte.

Ich bin nicht sicher, ob dies für alle Farbskalenelemente in ggplot der Fall ist

Georgette
quelle
3
Die Verwendung legendin einem scale_*Anruf ist veraltet, besser zu tun scale_colour_hue(guide = "none").
Gregor Thomas
3
Unter Berücksichtigung der legend=FALSETatsache, dass das veraltet ist, wie im Kommentar von @shujaa hervorgehoben, handelt es sich effektiv um eine doppelte Antwort, dh um das guide = "none"zu einer scale_fill/color*Funktion hinzuzufügen .
David LeBauer