25

I'm trying to change the order in which legend items appear. I've spent about an hour at this, with no results.

Here's an example setup:

library(ggplot2)
set.seed(0)
d <- data.frame(x = runif(3), y = runif(3), a = c('1', '3', '10'))

And here's one of the many things I've tried:

ggplot(d, aes(x = x, y = y)) + 
    geom_point(size=7, aes(color = a, order = as.numeric(a)))

enter image description here

(My naive hope, of course, was that the legend items would be shown in the numeric order: 1, 3, 10.)

MrFlick
  • 195,160
  • 17
  • 277
  • 295
kjo
  • 33,683
  • 52
  • 148
  • 265

2 Answers2

42

ggplot will usually order your factor values according to the levels() of the factor. You are best of making sure that is the order you want otherwise you will be fighting with a lot of function in R, but you can manually change this by manipulating the color scale:

ggplot(d, aes(x = x, y = y)) + 
    geom_point(size=7, aes(color = a)) + 
    scale_color_discrete(breaks=c("1","3","10"))
MrFlick
  • 195,160
  • 17
  • 277
  • 295
11

The order of legend labels can be manipulated by reordering and changing values in column a to the factor: d$a <- factor(d$a, levels = d$a)

So your code would look like this

library(ggplot2)
set.seed(0)
d <- data.frame(x = runif(3), y = runif(3), a = c('1', '3', '10'))

d$a <- factor(d$a, levels = d$a)

ggplot(d, aes(x = x, y = y)) + 
  geom_point(size=7, aes(color = a))

And the ouptut enter image description here

Note, than now in legend: 1 is red, 3 is green and 10 is blue color

Miha
  • 2,559
  • 2
  • 19
  • 34
  • 4
    Thanks! I upvoted this answer because it provides useful information, but I'll hold out for answer that does not require modifying the underlying `data.frame`. Somehow, I find it hard to believe that `ggplot2` would require changing the underlying `data.frame` in order to change something as superficial as the ordering of items in a legend. – kjo Jul 27 '16 at 17:40