script qplot ggplot geom_bar course aesthetic r data-visualization ggplot2

qplot - Construya una leyenda manual para una trama complicada



plot in r ggplot (1)

No puedo descifrar cómo configurar manualmente una leyenda para este diagrama. Todo lo que realmente quiero es una simple leyenda a la derecha que use los tres colores y tenga un nombre al lado de cada uno.

El código actual se ve así:

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


Es necesario asignar los atributos a la estética (colores dentro de la instrucción aes) para producir una leyenda.

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

Entiendo de dónde viene Roland, pero dado que solo son 3 atributos, y surgen complicaciones al superponer barras y barras de error, puede ser razonable dejar los datos en formato ancho como están. Se puede reducir ligeramente en complejidad mediante el uso de geom_pointrange .

Para cambiar el color de fondo de la leyenda de barras de error en el original, agregue + theme(legend.key = element_rect(fill = "white",colour = "white")) a la especificación de la gráfica. Para fusionar diferentes leyendas, normalmente necesita tener un mapeo consistente para todos los elementos, pero actualmente está produciendo un artefacto de fondo negro para mí. Pensé que guide = guide_legend(fill = NULL,colour = NULL) establecería el fondo como nulo para la leyenda, pero no fue así. Quizás vale otra pregunta.

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

Para deshacerse del fondo negro en la leyenda, debe usar el argumento override.aes para el guide_legend . El propósito de esto es permitirle especificar un aspecto particular de la leyenda que no se puede asignar correctamente.

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