A few months ago I listened to an episode on the Founder’s Journal podcast that reviewed an essay, The Opportunity Cost of Everything, by Jack Raines. If you haven’t read it, then I suggest you invest 10 minutes in doing so. It will be time well spent.

Jack Raines references an article, Your Life in Weeks, by Tim Urban. The article, as you might guess, breaks down a human life into weeks. Using a week as the quantum of time makes sense: a year is too long, while a second is too short. A week is the Goldilocks time interval, neither too long nor too short: it’s just right.

The article includes some lovely visualisations like the one copied below.

Retire in your early 60s? Living the dream.

## Life Calendar

In the same article Jack Raines mentions the “Life Calendar”, a printed poster breaking down a typical lifespan into weeks. Buy it and decorate as you see fit…

… or you could roll your own.

Naturally I prefer the DIY approach. And I’m going to do it in R.

Start off by pulling into two core packages: `{dplyr}` for data manipulation (strictly I could do everything in base R, but this is more convenient) and `{ggplot2}` for plotting.

``````library(dplyr)
library(ggplot2)
``````

I store my birth date in `BIRTH`. Set up some constants and convert `BIRTH` to a `POSIXlt` object. I’m using the same life expectancy as Raines.

``````ROWS <- 52
# Estimated lifespan in years.
LIFE <- 90

BIRTH <- strptime("16-06-1972", "%d-%m-%Y")
``````

Next define `AGE` in weeks and convert `LIFE` to the same unit.

``````# Get age by subtracting birth date from current date (and convert to weeks).
AGE <- difftime(Sys.Date(), BIRTH, units = "weeks") %>% round()
# Convert lifespan to weeks.
LIFE <- LIFE * ROWS
``````

Create a factor for weeks that are in the past or future.

``````life <- factor(
c(
rep("past", AGE),
rep("future", LIFE - AGE)
),
levels = c("past", "future")
)
``````

Now lay it out in a grid. This reminds me of how useful the `expand.grid()` function is.

``````data <- expand.grid(
y = 1:ROWS,
x = seq_len(ceiling(length(life) / ROWS))
) %>%
mutate(group = life)
``````

And finally use `{ggplot2}` with `geom_tile()` to visualise.

Weeks in the past are rendered in red, while the future is grey. I also created a square version.