21

does anyone know how to rotate axis ticks in the date format with ggplot2? I want to get labels with "Date-Month" (ex. "1985-5") with a 45° angle on the x axis.

data sample:

Station Date Ptot
A 1980-02 16
A 1980-03 19
A 1980-04 40
A 1980-05 48
A 1980-06 NA
A 1980-07 18.5
A 1980-08 24.6
B 1980-07 50.8
B 1980-08 28.9
B 1980-09 32.9
B 1980-10 47.9
B 1980-11 16.3

I tried this:

library(ggplot2)
library(scales)

plot <- ggplot(data=na.omit(data), aes(x=Date, y=Ptot, group=Station))+
   geom_line()+
   facet_grid(Station~.)+
   scale_x_date(breaks = "year", labels=date_format("%Y-%m"))+
   xlab("Year")+
   ylab("Prec (mm)")+
   labs(colour = "Station")+
   theme(axis.text.x = element_text(angle = 45, hjust = 1))+
   theme_bw()

plot

but it doesn't work.

Thanks!

user2165907
  • 1,401
  • 3
  • 13
  • 28

1 Answers1

52

First, you should make column Date as date. As it do not have the day provided, you should add for example 01 to each date and convert them.

data$Date<-as.Date(paste(data$Date,"-01",sep=""),format="%Y-%m-%d")

To get correct placement of labels under x axis you should set not just angle= but also hjust=1 to ensure that end of the label is placed under the tick mark. Also theme_bw() should be placed before theme specification of axis texts.

ggplot(data=na.omit(data), aes(x=Date, y=Ptot, group=Station))+
  geom_line()+
  facet_grid(Station~.)+
  scale_x_date(breaks = "month", labels=date_format("%Y-%m"))+
  xlab("Year")+
  ylab("Prec (mm)")+theme_bw()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

enter image description here

Didzis Elferts
  • 95,661
  • 14
  • 264
  • 201
  • I was just about to write that. – Arun Apr 05 '13 at 16:44
  • Thanks! I din't mention that I had done the date transformation of my "Date" column... I still have to learn to optimize the use of this forum. My problem was the position of theme_bw() – user2165907 Apr 05 '13 at 16:51
  • 1
    @user2165907 theme_bw() also set parameters for the axis.text, so it should be placed before your parameters. – Didzis Elferts Apr 05 '13 at 17:02
  • 1
    UPDATE you now might need to add `vjust = 0.5` to get better alignment. Thanks to @jupp0r's [comments in this answer](http://stackoverflow.com/a/1331400/4606130) theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) – micstr Jul 31 '16 at 12:42