Erstellen Sie eine manuelle Legende für eine komplizierte Handlung

74

Ich kann nicht herausfinden, wie man eine Legende für dieses Diagramm manuell erstellt. Alles, was ich wirklich will, ist eine einfache Legende rechts, die die drei Farben verwendet und neben jeder einen Namen hat.

Geben Sie hier die Bildbeschreibung ein

Der aktuelle Code sieht folgendermaßen aus:

a <-c("S1","S2","S3","S4","S5","S6","S7","S8","S9") #names
b <-c(0.23,0.26,0.55,0.56,0.36,0.23,0.18,0.06,0.04) #mean t0
c <-c(0.64,0.6,0.81,1.4,0.89,0.55,0.48,0.22,0.09) #mean t1
d <-c(0.20,0.23,0.52,0.53,0.33,0.20,0.15,0.04,0.03) #SD low t0
e <-c(0.26,0.29,0.58,.59,0.39,0.26,0.21,0.08,0.05) #SD high t0
f <-c(0.67,0.63,0.86,1.44,0.93,0.59,0.51,0.25,0.10) #SD high t1
g <-c(0.61,0.57,0.78,1.36,0.85,0.53,0.45,0.19,0.08) #SD low t1
h <-c(0.41,0.34,0.26,0.84,0.53,0.32,0.30,0.16,0.05) #absolute change

data <- data.frame(a,b,c,d,e,f,g,h)

ggplot(data=data,aes(a)) + 
  geom_bar(stat="identity", aes(y=h),fill="#62c76b",colour="#333333")+ #green
  geom_line(aes(y=b,group=1),size=1.0,colour="#f04546") +   #red
  geom_point(aes(y=b),size=3, colour="#f04546") +           #red
  geom_errorbar(aes(ymin=d, ymax=e), colour="#f04546", width=0.1, size=.8) + 
  geom_line(aes(y=c,group=1),size=1.0,colour="#3591d1") +   #blue 
  geom_point(aes(y=c),size=3, colour="#3591d1") +           #blue
  geom_errorbar(aes(ymin=f, ymax=g), colour="#3591d1", width=0.1, size=.8) + 
  ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
  ylim(0,1.6) +
  theme_bw() +
  theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
  theme(axis.title.y = element_text(size = 15, vjust=0.3))
Torvon
quelle
3
Sehr hilfreich - woher hätte ich den Code, wenn nicht Dokumentation und Tutorials?
Torvon

Antworten:

107

Sie müssen der Ästhetik Attribute zuordnen (Farben innerhalb der aes-Anweisung), um eine Legende zu erstellen.

cols <- c("LINE1"="#f04546","LINE2"="#3591d1","BAR"="#62c76b")
ggplot(data=data,aes(x=a)) + 
  geom_bar(stat="identity", aes(y=h, fill = "BAR"),colour="#333333")+ #green
  geom_line(aes(y=b,group=1, colour="LINE1"),size=1.0) +   #red
  geom_point(aes(y=b, colour="LINE1"),size=3) +           #red
  geom_errorbar(aes(ymin=d, ymax=e, colour="LINE1"), width=0.1, size=.8) + 
  geom_line(aes(y=c,group=1,colour="LINE2"),size=1.0) +   #blue 
  geom_point(aes(y=c,colour="LINE2"),size=3) +           #blue
  geom_errorbar(aes(ymin=f, ymax=g,colour="LINE2"), width=0.1, size=.8) + 
  scale_colour_manual(name="Error Bars",values=cols) + scale_fill_manual(name="Bar",values=cols) +
  ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
  ylim(0,1.6) +
  theme_bw() +
  theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
  theme(axis.title.y = element_text(size = 15, vjust=0.3))

Geben Sie hier die Bildbeschreibung ein

Ich verstehe, woher Roland kommt, aber da dies nur drei Attribute sind und Komplikationen durch Überlagerung von Balken und Fehlerbalken entstehen, kann es sinnvoll sein, die Daten so wie sie sind im Breitformat zu belassen. Durch die Verwendung von geom_pointrange kann die Komplexität geringfügig reduziert werden .


Fügen Sie der Plotspezifikation hinzu, um die Hintergrundfarbe für die Fehlerbalkenlegende im Original zu ändern + theme(legend.key = element_rect(fill = "white",colour = "white")). Um verschiedene Legenden zusammenzuführen, benötigen Sie normalerweise eine konsistente Zuordnung für alle Elemente, aber für mich wird derzeit ein Artefakt mit schwarzem Hintergrund erstellt. Ich dachte, ich guide = guide_legend(fill = NULL,colour = NULL)würde den Hintergrund für die Legende auf null setzen, aber das tat es nicht. Vielleicht eine andere Frage wert.

ggplot(data=data,aes(x=a)) + 
  geom_bar(stat="identity", aes(y=h,fill = "BAR", colour="BAR"))+ #green
  geom_line(aes(y=b,group=1, colour="LINE1"),size=1.0) +   #red
  geom_point(aes(y=b, colour="LINE1", fill="LINE1"),size=3) +           #red
  geom_errorbar(aes(ymin=d, ymax=e, colour="LINE1"), width=0.1, size=.8) + 
  geom_line(aes(y=c,group=1,colour="LINE2"),size=1.0) +   #blue 
  geom_point(aes(y=c,colour="LINE2", fill="LINE2"),size=3) +           #blue
  geom_errorbar(aes(ymin=f, ymax=g,colour="LINE2"), width=0.1, size=.8) + 
  scale_colour_manual(name="Error Bars",values=cols, guide = guide_legend(fill = NULL,colour = NULL)) + 
  scale_fill_manual(name="Bar",values=cols, guide="none") +
  ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
  ylim(0,1.6) +
  theme_bw() +
  theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
  theme(axis.title.y = element_text(size = 15, vjust=0.3))

Geben Sie hier die Bildbeschreibung ein


Um den schwarzen Hintergrund in der Legende zu entfernen, müssen Sie das override.aesArgument für das verwenden guide_legend. Damit können Sie einen bestimmten Aspekt der Legende angeben, der möglicherweise nicht richtig zugewiesen wurde.

ggplot(data=data,aes(x=a)) + 
  geom_bar(stat="identity", aes(y=h,fill = "BAR", colour="BAR"))+ #green
  geom_line(aes(y=b,group=1, colour="LINE1"),size=1.0) +   #red
  geom_point(aes(y=b, colour="LINE1", fill="LINE1"),size=3) +           #red
  geom_errorbar(aes(ymin=d, ymax=e, colour="LINE1"), width=0.1, size=.8) + 
  geom_line(aes(y=c,group=1,colour="LINE2"),size=1.0) +   #blue 
  geom_point(aes(y=c,colour="LINE2", fill="LINE2"),size=3) +           #blue
  geom_errorbar(aes(ymin=f, ymax=g,colour="LINE2"), width=0.1, size=.8) + 
  scale_colour_manual(name="Error Bars",values=cols, 
                      guide = guide_legend(override.aes=aes(fill=NA))) + 
  scale_fill_manual(name="Bar",values=cols, guide="none") +
  ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
  ylim(0,1.6) +
  theme_bw() +
  theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
  theme(axis.title.y = element_text(size = 15, vjust=0.3))

Geben Sie hier die Bildbeschreibung ein

Andy W.
quelle
Andy, vielen Dank. (1) Gibt es eine Möglichkeit, die 2-Zeile mit der 1-Takt-Legende zu "verschmelzen"? (2) Gibt es eine Möglichkeit, die Legende manuell zu ändern? ZB die Farbe des grauen Randes um LINE1 und LINE2? Ich habe nichts in der ggplot2-Dokumentation gefunden (woher mein gesamter Code stammt).
Torvon
@Torvon, um die Legende zusammenzuführen, müssen Sie normalerweise konsistente Zuordnungen für jedes Geom haben. Ich werde mit einem Beispiel aktualisieren, aber dies erzeugt ein seltsames Artefakt (vielleicht weil Linien keine inneren Füllungen haben). Es kann eine weitere Frage wert sein, um zu sehen, ob sie nach Ihren Wünschen geändert werden kann. Ich würde sagen, obwohl ich nicht denke, dass verschiedene Legenden eine großartige Idee sind. Mit zwei Legenden IMO ist es ziemlich einfach.
Andy W
Das war unglaublich hilfreich, aber das einzige Problem, auf das ich stoße, ist, dass meine Legende nicht auf die gleiche Weise wie Ihr erstes Beispiel (Fehlerbalken, Zeile 1, Zeile 2, Balken, Balken) zusammenkommt und stattdessen "Fehler" erscheint Balken, Balken, Zeile 1, Zeile 2, Balken "... eine Idee, an welche Argumente ich übergeben kann scale_color_manual, um dies anzupassen?
Dre
Es lohnt sich wahrscheinlich, ein reproduzierbares Beispiel zu erstellen und eine neue Frage @dre zu stellen. Ohne dieses reproduzierbare Beispiel ist es wirklich schwer zu helfen.
Andy W
6

Falls Sie Schwierigkeiten hatten, sich zu ändern linetypes, sollte die folgende Antwort hilfreich sein. (Dies ist eine Ergänzung zur Lösung von Andy W. )

Wir werden versuchen, das erlernte Muster zu erweitern:

cols <- c("LINE1"="#f04546","LINE2"="#3591d1","BAR"="#62c76b")
line_types <- c("LINE1"=1,"LINE2"=3)
ggplot(data=data,aes(x=a)) + 
  geom_bar(stat="identity", aes(y=h,fill = "BAR"))+ #green
  geom_line(aes(y=b,group=1, colour="LINE1", linetype="LINE1"),size=0.5) +   #red
  geom_point(aes(y=b, colour="LINE1", fill="LINE1"),size=2) +           #red
  geom_line(aes(y=c,group=1,colour="LINE2", linetype="LINE2"),size=0.5) +   #blue 
  geom_point(aes(y=c,colour="LINE2", fill="LINE2"),size=2) +           #blue
  scale_colour_manual(name="Error Bars",values=cols, 
                  guide = guide_legend(override.aes=aes(fill=NA))) + 
  scale_linetype_manual(values=line_types)+
  scale_fill_manual(name="Bar",values=cols, guide="none") +
  ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
  ylim(0,1.6) +
  theme_bw() +
  theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
  theme(axis.title.y = element_text(size = 15, vjust=0.3))

Was wir jedoch erhalten, ist das folgende Ergebnis: Handbuch ohne Namen

Das Problem ist, dass das linetypenicht in der Hauptlegende zusammengeführt wird. Beachten Sie, dass wir der Methode keinen Namen gegeben haben scale_linetype_manual. Der Trick, der hier funktioniert, besteht darin, ihm denselben Namen zu geben, den Sie für die Benennung verwendet haben scale_colour_manual. Insbesondere wenn wir die entsprechende Zeile wie folgt ändern, erhalten wir das gewünschte Ergebnis:

scale_linetype_manual(name="Error Bars",values=line_types)

Handbuch mit dem gleichen Namen

Jetzt ist es einfach, die Größe der Linie mit der gleichen Idee zu ändern.

Beachten Sie, dass das geom_barkeine Farbeigenschaft mehr hat. (Ich habe nicht versucht, dieses Problem zu beheben.) Auch das Hinzufügen geom_errorbarmit einem Farbattribut beeinträchtigt das Ergebnis. Es wäre großartig, wenn jemand eine bessere Lösung finden könnte, die auch diese beiden Probleme löst.

SAbbasizadeh
quelle