boshek
boshek

Reputation: 4406

Plotting a non-standard year (water year) with ggplot2

Building on this question and the use of "water year" in R I have question regarding plotting in ggplot2 with a common date axis over many years. A water year is definitely the start of the year to be October 1st ending September 30. It is a little more sensible for the hydrological cycle.

So say I have this data set:

library(dplyr)
library(ggplot2)
library(lubridate)

df <- data.frame(Date=seq.Date(as.Date("1910/1/1"), as.Date("1915/1/1"), "days"),
           y=rnorm(1827,100,1))

Then here is the wtr_yr function:

wtr_yr <- function(dates, start_month=10) {
  # Convert dates into POSIXlt
  dates.posix = as.POSIXlt(dates)
  # Year offset
  offset = ifelse(dates.posix$mon >= start_month - 1, 1, 0)
  # Water year
  adj.year = dates.posix$year + 1900 + offset
  # Return the water year
  adj.year
}

What I would like to do is use colour as a grouping variable, then make a x axes that only consists of month and date information. Usually I've done like so (using the lubridate package):

 ymd(paste0("1900","-",month(df$Date),"-",day(df$Date)))

This works fine if year is arranged normally. However in this water year scenario, the real year span the water year. So ideally I'd like a plot that goes from October 1 to September 30 and plot separate lines for each water year maintaining all the correct water years. Here is where I am so far:

df1 <- df %>%
  mutate(wtr_yrVAR=factor(wtr_yr(Date))) %>%
  mutate(CDate=as.Date(paste0("1900","-",month(Date),"-",day(Date))))

df1 <- %>%
  ggplot(aes(x=CDate, y=y, colour=wtr_yrVAR)) +
  geom_point()

So plotting that obviously date spans from Jan to Dec. Any ideas how I can force ggplot2 to plot these along the water year lines?

Upvotes: 4

Views: 928

Answers (2)

lbusett
lbusett

Reputation: 5932

not very elegant but this should work:

df1 <- df %>%
  mutate(wtr_yrVAR=factor(wtr_yr(Date))) %>%
  mutate(CDdate= as.Date(as.numeric(Date - as.Date(paste0(wtr_yrVAR,"-10-01"))), origin = "1900-10-01"))

df1 %>%  ggplot(aes(x =CDdate, y=y, colour=wtr_yrVAR)) +
  geom_line() + theme_bw()+scale_x_date(date_breaks = "1 month", date_labels = "%b", limits = c(as.Date("1899-09-30"),as.Date("1900-10-01")))+theme_bw()

Upvotes: 1

Zach
Zach

Reputation: 1153

Here is a method that works:

df3 <- df %>%
  mutate(wtr_yrVAR=factor(wtr_yr(Date))) %>%
  #seq along dates starting with the beginning of your water year
  mutate(CDate=as.Date(paste0(ifelse(month(Date) < 10, "1901", "1900"),
                              "-", month(Date), "-", day(Date))))

Then:

df3 %>%
  ggplot(., aes(x = CDate, y = y, colour = wtr_yrVAR)) +
  geom_point() +
  scale_x_date(date_labels = "%b %d")

Which gives:

enter image description here

Upvotes: 5

Related Questions