# [R] bar order using lattice barchart()

Greg Snow Greg.Snow at imail.org
Thu May 6 19:51:39 CEST 2010

```The short answer to your query is ?reorder

The longer answer (or a longer answer) gets into a bit of philosophy (so feel free to go back to the short answer and skip this if you don't want to get into the philosophy, you have been warned).  Let's start with the question: is the order of the bars a property of the graph/analysis? The dataset as a whole? Or the individual variable?

Some programs take the first approach, the order is a property of the graph or analysis, these programs have you specify things like the order at the time of creating the graph or doing the analysis.  I don't like this approach because it seems to me that this should be more inherent to the data than the output, also this means that you have to keep specifying the order for every graph/analysis and I am too lazy to like that.

Your attempt was number 2, the order should be a property of the dataset.  For your example this makes a lot of sense, you want x ordered by y.  But this does not generalize to some other situations, so is not the standard for R.

My favorite (and what is used in R, so apparently I'm not the only one) is to have things like the order be a property of the individual variable (x in this case).  Your data frame will have x as a factor by default (and even if you specifically told R to not convert it to a factor, then many plotting/analysis functions will still convert it to a factor).  If you don't specify the order of the factor levels then the default is to do it alphabetically and this will be used by plotting/analysis functions regardless of the order in the data set.  One of the easier ways to change the order of the factor levels, especially for a case like yours is using the reoder function, try something like:

> xy\$x <- reorder( xy\$x, xy\$y )

You won't see any obvious differences when you print the data frame, but if you print just x then you should and your plots should come out the way that you want now.

You did ask "why?" and were warned.  Hope this helps,

--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of Tim Clark
> Sent: Wednesday, May 05, 2010 8:57 PM
> To: r-help at r-project.org
> Subject: [R] bar order using lattice barchart()
>
> Dear List,
>
> I am want to plot my data in increasing order using the lattice
> barchart() function.  I used order() to put my data in the order I
> want, but when I plot it I get the original order of the data.  I think
> this has to do with the row index number since order() does not re-
> number the rows in the new order but instead keeps the original row
> numbers and puts them in a different order.  For example:
>
> xy<-data.frame(x=letters[1:5],y=c(3,9,2,1,10))
>
> #This produces a dataframe in alphebitical order with row numbers in
> #numerical order.
> > xy
>   x         y
> 1 a  8.921657
> 2 b 10.314625
> 3 c  9.531537
> 4 d 10.818563
> 5 e  9.084872
>
>
> #If I re-order the data based on the value of y
>
> xy<-xy[order(y),]
>
> #I get a dataframe ordered by y but the row numbers are still in
> #alphebetical order based on x
> > xy
>   x         y
> 1 a  8.921657
> 5 e  9.084872
> 3 c  9.531537
> 2 b 10.314625
> 4 d 10.818563
>
> #I then try to plot the data and it plots it in alphabetical instead of
> #numeric order
> library(lattice)
> barchart(y~x, data=xy)
>
>
>
> Why are the rows not re-indexed, and how do I get barchart() to plot my
> data in increasing numeric order?
>
> Thanks,
>
> Tim
>
>
>
>
> Tim Clark
> Department of Zoology
> University of Hawaii
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help