Je n'arrive pas à comprendre comment configurer manuellement une légende pour ce tracé. Tout ce que je veux vraiment, c'est une simple légende à droite qui utilise les trois couleurs et porte un nom à côté de chacune d'elles.
Le code actuel ressemble à ceci:
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))
Vous devez mapper les attributs sur l'esthétique (couleurs dans la déclaration aes) pour générer une légende.
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))
Je comprends d’où vient Roland, mais comme il ne s’agit que de 3 attributs et que la superposition de barres et de barres d’erreur pose des complications, il peut être raisonnable de laisser les données au format large telles quelles. La complexité pourrait être légèrement réduite de en utilisant geom_pointrange .
Pour modifier la couleur d'arrière-plan de la légende des barres d'erreur dans l'original, ajoutez + theme(legend.key = element_rect(fill = "white",colour = "white"))
à la spécification du tracé. Pour fusionner différentes légendes, vous devez généralement avoir un mappage cohérent pour tous les éléments, mais cela produit actuellement un artefact d'un fond noir pour moi. Je pensais que guide = guide_legend(fill = NULL,colour = NULL)
définirait l'arrière-plan sur null pour la légende, mais ce n'est pas le cas. Peut-être mérite une autre question.
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))
Pour supprimer le fond noir de la légende, vous devez utiliser l'argument override.aes
De guide_legend
. L'objectif est de vous permettre de spécifier un aspect particulier de la légende qui peut ne pas être affecté correctement.
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))
Si vous avez du mal à changer linetypes
, la réponse suivante devrait vous être utile. (Ceci est un ajout à la solution par Andy W .)
Nous allons essayer d'étendre le modèle appris:
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))
Cependant, nous obtenons le résultat suivant:
Le problème est que le linetype
n'est pas fusionné dans la légende principale. Notez que nous n’avons donné aucun nom à la méthode scale_linetype_manual
. Le truc qui marche ici est de lui donner le même nom que celui que vous avez utilisé pour nommer scale_colour_manual
. Plus précisément, si nous modifions la ligne correspondante par la suivante, nous obtenons le résultat souhaité:
scale_linetype_manual(name="Error Bars",values=line_types)
Maintenant, il est facile de changer la taille de la ligne avec la même idée.
Notez que le geom_bar
n'a plus la propriété de couleur. (Je n'ai pas essayé de résoudre ce problème.) Ajoutez également geom_errorbar
avec l'attribut color gâche le résultat. Ce serait bien si quelqu'un pouvait trouver une meilleure solution qui résoudrait également ces deux problèmes.