How can I order the months chronologically in ggplot2 short of writing the months out?

I am trying to plot count v/s month

ggplot(dat, aes(x=month, y=count,group=region)) +
    geom_line(data=mcount[mcount$region == "West coast", ],colour="black",stat="identity", position="dodge")+
     geom_point(data=mcount[mcount$region == "West coast", ],colour="black", size=2, shape=21, fill="white")+
     theme_bw()+
     theme(legend.key = element_rect(colour = "black")) +
     guides(fill = guide_legend(override.aes = list(colour = NULL)))+
     ggsave("test.png",width=6, height=4,dpi=300)

enter image description here

But I want to order the months chronologically from Jan to Dec. How can I do this short of writing all the months out?

dput

structure(list(region = structure(c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L), .Label = c("West coast", "Arizona", "Front range", "Flash flood alley", 
"Mississippi valley", "Appalachians"), class = "factor"), month = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 4L, 12L, 11L, 
5L, 2L, 9L, 8L, 6L, 10L, 3L, 7L, 8L, 10L, 5L, 1L, 6L, 7L, 4L, 
6L, 8L, 2L, 1L, 7L, 5L, 3L, 11L, 12L, 9L, 10L, 2L, 7L, 3L, 6L, 
12L, 11L, 10L, 9L, 4L, 1L, 11L, 4L, 2L, 1L, 12L, 9L, 3L, 8L, 
5L, 6L, 10L, 7L, 5L, 8L, 11L, 12L, 4L, 3L, 9L, 2L), .Label = c("Apr", 
"Dec", "Oct", "Mar", "May", "Jul", "Sep", "Jun", "Nov", "Aug", 
"Jan", "Feb"), class = "factor"), count = c(566, 545, 427, 751, 
357, 399, 568, 433, 454, 347, 511, 251, 267, 207, 167, 142, 417, 
109, 117, 373, 207, 130, 125, 145, 7, 14, 2, 2, 7, 3, 107, 74, 
135, 48, 80, 53, 117, 125, 59, 53, 103, 30, 21, 18, 8, 22, 26, 
37, 20, 5, 11, 1, 96, 29, 109, 8, 33, 53, 6, 1, 5, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0)), .Names = c("region", "month", "count"), row.names = c(NA, 
-72L), class = c("data.table", "data.frame"))

Solution 1:

Use the built-in month.name or month.abb variable to specify the levels of your factor in the correct order. In this case, you have abbreviations so month.abb is appropriate.

your_data$month = factor(your_data$month, levels = month.abb)

I think creating the factor in the correct order is the best way, but you can also just order the axis using the limits argument of the discrete scale (see ?discrete_scale for more info).

+ scale_x_discrete(limits = month.abb)

Locales

If you are in a non-English locale, you can construct your own month name constants with a little date formatting (basically stolen from Brian Ripley in this R-Help thread):

 month.name.loc = format(ISOdate(2004, 1:12, 1), "%B")
 month.abb.loc  = format(ISOdate(2004, 1:12, 1), "%b")

If you want to use month names/abbreviations from a different locale than you're in, the withr package is useful.