Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Construct a manual legend for a complicated plot

I cannot figure out how to manually set up a legend for this plot. All I really want is a simple legend to the right that uses the three colors and has a name next to each.

enter image description here

The current code looks like this:

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)) 
like image 559
Torvon Avatar asked Jun 17 '13 13:06

Torvon


People also ask

How do I get rid of the legend in ggplot2?

Example 1: Remove All Legends in ggplot2 We simply had to specify legend. position = “none” within the theme options to get rid of both legends.

How do I change the legend label in ggplot2?

You can use the following syntax to change the legend labels in ggplot2: p + scale_fill_discrete(labels=c('label1', 'label2', 'label3', ...))

Why doesn't my Ggplot have a legend?

If you want to add a legend to a ggplot2 chart you will need to pass a categorical (or numerical) variable to color , fill , shape or alpha inside aes . Depending on which argument you use to pass the data and your specific case the output will be different.

How do I create a legend in ggplot2?

Control legend position with legend. To put it around the chart, use the legend. position option and specify top , right , bottom , or left . To put it inside the plot area, specify a vector of length 2, both values going between 0 and 1 and giving the x and y coordinates. Note: the command legend.


1 Answers

You need to map attributes to aesthetics (colours within the aes statement) to produce a legend.

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

I understand where Roland is coming from, but since this is only 3 attributes, and complications arise from superimposing bars and error bars this may be reasonable to leave the data in wide format like it is. It could be slightly reduced in complexity by using geom_pointrange.


To change the background color for the error bars legend in the original, add + theme(legend.key = element_rect(fill = "white",colour = "white")) to the plot specification. To merge different legends, you typically need to have a consistent mapping for all elements, but it is currently producing an artifact of a black background for me. I thought guide = guide_legend(fill = NULL,colour = NULL) would set the background to null for the legend, but it did not. Perhaps worth another 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)) 

enter image description here


To get rid of the black background in the legend, you need to use the override.aes argument to the guide_legend. The purpose of this is to let you specify a particular aspect of the legend which may not be being assigned correctly.

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

like image 59
Andy W Avatar answered Oct 09 '22 12:10

Andy W