it-swarm.com.de

Erstellen Sie eine manuelle Legende für einen komplizierten Plot

Ich kann nicht herausfinden, wie man eine Legende für diese Handlung manuell erstellt. Ich möchte nur eine einfache Legende auf der rechten Seite, die die drei Farben verwendet und neben jeder einen Namen hat.

enter image description here

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))
62
Torvon

Sie müssen Attribute der Ästhetik 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))

enter image description here

Ich verstehe, wo Roland herkommt, aber da dies nur 3 Attribute sind und Komplikationen durch das Überlagern von Balken und Fehlerbalken entstehen, kann es sinnvoll sein, die Daten im Breitformat zu belassen, wie sie sind. Die Komplexität könnte durch mit geom_pointrange leicht reduziert werden.


Fügen Sie der Plotspezifikation + theme(legend.key = element_rect(fill = "white",colour = "white")) hinzu, um die Hintergrundfarbe für die Fehlerbalkenlegende im Original zu ändern. Um verschiedene Legenden zusammenzuführen, müssen Sie normalerweise eine konsistente Zuordnung für alle Elemente haben, aber derzeit wird für mich ein Artefakt mit schwarzem Hintergrund erzeugt. Ich dachte, 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))

enter image description here


Um den schwarzen Hintergrund in der Legende zu entfernen, müssen Sie das Argument override.aes Für guide_legend Verwenden. 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))

enter image description here

93
Andy W

Falls Sie Schwierigkeiten hatten, linetypes zu ändern, 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: manual without name

Das Problem ist, dass das linetype nicht 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 von scale_colour_manual Verwendet haben. Genauer gesagt, wenn wir die entsprechende Zeile wie folgt ändern, erhalten wir das gewünschte Ergebnis:

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

manual with the same name

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

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

2
SAbbasizadeh