Question

I want to create a time series plot of temperatures for the summers of 2012 and 2013.

The only problem is that I want the data series to plot one on top of the other so they can be easily compared instead of sequentially along the date axis.

temp <- c(22, 22, 26, 23, 18, 20, 18, 17)
date <- as.Date(c("2012-06-01", "2012-07-01","2012-08-01","2012-09-01","2013-06-01","2013-07-01","2013-08-01","2013-09-01"))
year <- as.factor(c("2012", "2012", "2012", "2012","2013", "2013","2013","2013"))

df<- data.frame(temp, date, year)

Here's what I have so far using ggplot2

require(ggplot2)
ggplot(df, aes(date, temp, color=year))+
  geom_point()

The graph doesn't need to have the full dates listed on they x axis, in fact, it should probably just have month and day and that might solve the problem, i.e.

df$dayMo <- c("07-01", "07-02","07-03","07-04","07-01","07-02","07-03","07-04")

I didn't see a way to get as.Date or as.POSIXct (strptime) to allow this day-month format.

I'm also open to some other creative way of getting this done. Any ideas?

Was it helpful?

Solution

If your base dataset is temp and date, then this avoids manipulating the original data frame:

ggplot(df) +
  geom_point(aes(x=strftime(date,format="%m-%d"),
                 y=temp, 
                 color=strftime(date,format="%Y")), size=3)+
  scale_color_discrete(name="Year")+
  labs(x="date")

EDIT (Response to OP's comment).

So this combines the approach above with Henrik's, using dates instead of char for the x-axis, and avoiding modification of the original df.

library(ggplot2)
ggplot(df) +
  geom_point(aes(x=as.Date(paste(2014,strftime(date,format="%m-%d"),sep="-")),
                 y=temp, 
                 color=strftime(date,format="%Y")), size=3)+
  scale_color_discrete(name="Year")+
  labs(x="date")

OTHER TIPS

Another possibility is to create a fake date where a single year is concatenated with month and day from the original 'date'. An x variable of class Date is easy to format with scale_x_date. Load scales package to access nice breaks and formatting functions: labels = date_format(); breaks = date_breaks(). See strptime for other date formats.

library(scales)

df$date2 <- as.Date(paste(2014, format(date, "%m-%d"), sep = "-"))

ggplot(df, aes(date2, temp, color = year)) +
  geom_point() +
  scale_x_date(labels = date_format("%m/%d"))

ggplot(df, aes(date2, temp, color=year)) +
  geom_point() +
  scale_x_date(labels = date_format("%b-%d"),
               breaks = date_breaks("months"))

If you want to plot both years in the same plot above each other then use dayMo as your x values (they don't have to be date object).

df$dayMo<-c("06-01", "07-01","08-01","09-01","06-01", "07-01","08-01","09-01")
ggplot(df, aes(dayMo, temp, color=year))+
  geom_point()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top