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.
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))
r
data-visualization
ggplot2
Torvon
quelle
quelle
Antworten:
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))
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, ichguide = 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))
Um den schwarzen Hintergrund in der Legende zu entfernen, müssen Sie das
override.aes
Argument für das verwendenguide_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))
quelle
scale_color_manual
, um dies anzupassen?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:
Das Problem ist, dass das
linetype
nicht in der Hauptlegende zusammengeführt wird. Beachten Sie, dass wir der Methode keinen Namen gegeben habenscale_linetype_manual
. Der Trick, der hier funktioniert, besteht darin, ihm denselben Namen zu geben, den Sie für die Benennung verwendet habenscale_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)
Jetzt ist es einfach, die Größe der Linie mit der gleichen Idee zu ändern.
Beachten Sie, dass das
geom_bar
keine Farbeigenschaft mehr hat. (Ich habe nicht versucht, dieses Problem zu beheben.) Auch das Hinzufügengeom_errorbar
mit 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.quelle