Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reorder legend without changing order of points on plot

Tags:

r

legend

ggplot2

I keep running into this issue in ggplot2, perhaps someone can help me.

I have a plot where the order of the variables in the legend is in reverse order to how they are displayed on the plot.

For example:

df=data.frame(
 mean=runif(9,2,3),
 Cat1=rep(c("A","B","C"),3),
 Cat2=rep(c("X","Y","Z"),each=3))

dodge=position_dodge(width=1)
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+
 geom_point(aes(shape=Cat2),size=4,position=dodge)+
 scale_color_manual(values=c("red","blue","black"))+
 scale_shape_manual(values=c(16:19))+
 coord_flip()

produces:

example

So the points are displayed on the plot as Cat2=Z,Y, then X (black diamonds, blue triangle, red circle) but in the legend they are displayed as Cat2=X, Y, then Z (red circle, blue triangle, black diamond).

How can I reverse the order of the legend without shifting the points on the plot? Reordering the factor produces the opposite problem (points on the plot are reversed).

Thanks!

like image 599
jslefche Avatar asked Sep 26 '11 14:09

jslefche


1 Answers

To flesh out Hadley's comment, we would do something like this:

ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+
 geom_point(aes(shape=Cat2),size=4,position=dodge)+
 scale_color_manual(values=c("red","blue","black"),breaks = c('Z','Y','X'))+
 scale_shape_manual(values=c(16:19),breaks = c('Z','Y','X'))+
 coord_flip()

enter image description here

Note that we had to set the breaks in both scales. If we did just one, they wouldn't match, and ggplot would split them into two legends, rather than merging them.

like image 146
joran Avatar answered Sep 23 '22 00:09

joran