## Wednesday, January 07, 2015

### Changing the order of x-axis factor labels using levels

I had some problems with my factors showing up in alphabetical order instead of the order I needed.

I googled this problem and found that I should be using levels.  The linked post is more about different ways this works, but I found it helpful in understanding the principles.

So, here's a set of invented data with a factor category that we'll examine.

ordinals<-c("first", "second", "fourth", "third", "fourth", "third", "second", "first")
numerals<-c(1,2,4,3,4,3,2,1)
data<-data.frame(ordinals,numerals)

plot(x=data\$ordinals, y=data\$numerals, #your x and y data
xlab='ordinals', ylab='numerals') #always label your axes

#This plot orders the factors alphabetically.
#However, it makes no sense logically to have fourth come right after first.
#I've also used this when I want to order sites

#Let's look at the data structure.
str(data)
#You can see that there are four levels of the factor data.frame\$ordinals.
#'data.frame':  8 obs. of  2 variables:
#\$ ordinals: Factor w/ 4 levels "first","fourth",..: 1 3 2 4 2 4 3 1
#\$ numerals: num  1 2 4 3 4 3 2 1
#data\$ordinals is ordered alphabetically (you can see fourth comes after first).

#To remedy this oddity, make a list ordering your levels as desired.
levels.we.want<-c("first", "second", "third", "fourth")

#Create a new column from the ordinals column,
#using the new level ordering as levels.
data\$ordinals.ordered<-factor(data\$ordinals, levels=levels.we.want)

str(data)

#The results now show the new column has correctly ordered levels.
#'data.frame':  8 obs. of  3 variables:
#\$ ordinals        : Factor w/ 4 levels "first","fourth",..: 1 3 2 4 2 4 3 1
#\$ numerals        : num  1 2 4 3 4 3 2 1
#\$ ordinals.ordered: Factor w/ 4 levels "first","second",..: 1 2 4 3 4 3 2 1

plot(x=data\$ordinals.ordered, y=data\$numerals, #your x and y data
xlab='ordinals in order', ylab='numerals')#axis labels

#All better!