Plot Weekly or Monthly Totals in R

August 29, 2013
By

(This article was first published on Mollie's Research Blog, and kindly contributed to R-bloggers)

When plotting time series data, you might want to bin the values so that each data point corresponds to the sum for a given month or week. This post will show an easy way to use cut and ggplot2's stat_summary to plot month totals in R without needing to reorganize the data into a second data frame.

Let's start with a simple sample data set with a series of dates and quantities:

library(ggplot2)
library(scales)

# load data:
log <- data.frame(Date = c("2013/05/25","2013/05/28","2013/05/31","2013/06/01","2013/06/02","2013/06/05","2013/06/07"),
Quantity = c(9,1,15,4,5,17,18))
log
str(log)

> log
Date Quantity
1 2013/05/25 9
2 2013/05/28 1
3 2013/05/31 15
4 2013/06/01 4
5 2013/06/02 5
6 2013/06/05 17
7 2013/06/07 18

> str(log)
'data.frame': 7 obs. of 2 variables:
$ Date : Factor w/ 7 levels "2013/05/25","2013/05/28",..: 1 2 3 4 5 6 7
$ Quantity: num 9 1 15 4 5 17 18


Next, if the date data is not already in a date format, we'll need to convert it to date format:

# convert date variable from factor to date format:
log$Date <- as.Date(log$Date,
"%Y/%m/%d") # tabulate all the options here
str(log)

> str(log)
'data.frame': 7 obs. of 2 variables:
$ Date : Date, format: "2013-05-25" "2013-05-28" ...
$ Quantity: num 9 1 15 4 5 17 18

Next we need to create variables stating the week and month of each observation. For week, cut has an option that allows you to break weeks as you'd like, beginning weeks on either Sunday or Monday.

# create variables of the week and month of each observation:
log$Month <- as.Date(cut(log$Date,
breaks = "month"))
log$Week <- as.Date(cut(log$Date,
breaks = "week",
start.on.monday = FALSE)) # changes weekly break point to Sunday
log

> log
Date Quantity Month Week
1 2013-05-25 9 2013-05-01 2013-05-19
2 2013-05-28 1 2013-05-01 2013-05-26
3 2013-05-31 15 2013-05-01 2013-05-26
4 2013-06-01 4 2013-06-01 2013-05-26
5 2013-06-02 5 2013-06-01 2013-06-02
6 2013-06-05 17 2013-06-01 2013-06-02
7 2013-06-07 18 2013-06-01 2013-06-02

Finally, we can create either a line or bar plot of the data by month and by week, using stat_summary to sum up the values associated with each week or month:

# graph by month:
ggplot(data = log,
aes(Month, Quantity)) +
stat_summary(fun.y = sum, # adds up all observations for the month
geom = "bar") + # or "line"
scale_x_date(
labels = date_format("%Y-%m"),
breaks = "1 month") # custom x-axis labels
Time series plot, binned by month


# graph by week:
ggplot(data = log,
aes(Week, Quantity)) +
stat_summary(fun.y = sum, # adds up all observations for the week
geom = "bar") + # or "line"
scale_x_date(
labels = date_format("%Y-%m-%d"),
breaks = "1 week") # custom x-axis labels
Time series plot, totaled by week


The full code is available in a gist.

References

To leave a comment for the author, please follow the link and comment on his blog: Mollie's Research Blog.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.