3

I have a data.frame with entries like:

   variable  importance order
1       foo  0.06977263     1
2       bar  0.05532474     2
3       baz  0.03589902     3
4     alpha  0.03552195     4
5      beta  0.03489081     5
       ...

When plotting the above, with the breaks = variable, I would like for the order to be preserved, rather than placed in alphabetical order.

I am rendering with:

 
ggplot (data, aes(x=variable, weight=importance, fill=variable)) + 
    geom_bar() + 
    coord_flip() + opts(legend.position='none')

However, the ordering of the variable names is alphabetical, and not the order within the data frame. I had seen a post about using "order" in aes, but appears to have no effect.

I am looking to have a breaks ordering in-line with the "order" column.

There seems to be a similar question How to change the order of discrete x scale in ggplot, but frankly, did not understand the answer in this context.

4
  • 1
    FYI: It's easier for people to answer if you use dput and add a small sample of the data to the end of your post (or else use a globally available dataset from the datasets package in base R). Commented Oct 22, 2010 at 20:33
  • Is variable a character or a factor? Commented Oct 22, 2010 at 20:39
  • variable is a factor. I'm going to look at the answers below ... Commented Oct 22, 2010 at 23:15
  • Shane, thanks for the tip. Was not aware of dput. Commented Oct 22, 2010 at 23:35

4 Answers 4

7

Try:

data$variable <- factor(data$variable, levels=levels(data$variable)[order(-data$order)])

From: ggplot2 sorting a plot Part II

Sign up to request clarification or add additional context in comments.

Comments

4

Even shorter and easier to understand:

data$Variable <- reorder(data$Variable, data$order)

Comments

2

Another solution is to plot the order and then change the labels after the fact:

df <- data.frame(variable=letters[c(3,3,2,5,1)], importance=rnorm(5), order=1:5)
p <- qplot(x=order, weight=importance, fill=variable, data=df, geom="bar") + 
  scale_x_continuous("", breaks=1:5, labels=df$variable) + 
  coord_flip() + opts(legend.position='none')

1 Comment

Thanks. This solves it. Wish there was a built-in approach with an order attribute, but I suppose would not be a widely used feature.
1

A shot in the dark, but maybe something like this:

data$variable <- factor(data$variable, levels=data$variable)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.