Making Calendar with ggplot + Moon Phase Calendar for fun

Making calendar using ggplot2 + using Moon Phase font

Chisato

3 minute read

Making Calendar with ggplot2

I recently discovered font called Moon Phase. I also recently discovered R package, suncalc, and I can get Moon Illumination data by day, so I thought I’d use both to create a simple calendar using ggplot2.

Prepping The Data

To make calendar, I need to strip out weekday, month, day, week number within a month. So I can use weekday as x-axis, week number within a month as y-axis, and facet by month.

## use getMoonIllusmination function to get moon fraction, phase, and angle for 2018.
Moon_2018 <-getMoonIllumination(date = seq.Date(as.Date("2018-01-01"), as.Date("2018-12-31"), by = 1), 
                                 keep = c("fraction", "phase", "angle"))


## Append Extra Info, so I can use ggplot to make calendar. 
Moon_2018_df <- Moon_2018 %>% 
  mutate(wkdy = fct_inorder(weekdays(date, abbreviate=T)), ## 2018 worked well because it starts on Monday
         wkn = week(date), ## Week Number
         mo = month(date, label=T, abbr=T), ## Month
         day = day(date), ## Day
         moon.phase = cut(#phase,breaks=seq(0,1,by=1/28), ## this doesn't work...
                          phase,breaks=seq(0,1,by=1/56),
                          ordered_result=T)) %>%
  group_by(mo) %>% 
  mutate(wkn.mo = dense_rank(wkn)) %>%
  ungroup()

## Simply cutting into 28 blocks didn't work out..  
moon.font.tb <- tibble(
  moon.font = c(NA, letters[rep(1:13,rep(2,13))], 0,0, letters[rep(14:26,rep(2,13))],NA),
  moon.phase = levels(Moon_2018_df$moon.phase)
)

Moon_2018_df <- Moon_2018_df %>% left_join(moon.font.tb)

## Show the data around today to see what data above looks like.
Moon_2018_df %>% filter(between(date,today()-3,today()+3)) %>% kable()
date fraction phase angle wkdy wkn mo day moon.phase wkn.mo moon.font
2018-05-23 0.5928637 0.2797321 -1.1692842 Wed 21 May 23 (0.268,0.286] 4 h
2018-05-24 0.7013470 0.3159631 -1.1353234 Thu 21 May 24 (0.304,0.321] 4 i
2018-05-25 0.7972031 0.3513064 -1.1143088 Fri 21 May 25 (0.339,0.357] 4 j
2018-05-26 0.8764075 0.3856523 -1.1008454 Sat 21 May 26 (0.375,0.393] 4 k
2018-05-27 0.9364869 0.4189058 -1.0823715 Sun 21 May 27 (0.411,0.429] 4 l
2018-05-28 0.9763419 0.4508451 -1.0183864 Mon 22 May 28 (0.446,0.464] 5 m
2018-05-29 0.9959399 0.4797038 -0.6465735 Tue 22 May 29 (0.464,0.482] 5 m

Just Simple Calendar

First I just made simple calendar with below code.

##  Here's Just Calendar Part
Moon_2018_df %>% ggplot(aes(x=wkdy, y=wkn.mo)) + 
  geom_point(alpha=0.3, aes(color=wkdy), size=8) + 
  geom_text(aes(label=day),family="Roboto Condensed") +
  facet_wrap(~mo, scales="free_x", ncol=3) +  ## So that Each Line is Quarter!
  scale_x_discrete() +
  scale_y_reverse(breaks=NULL) +
  scale_colour_viridis_d(guide="none") +
  theme_ipsum_rc() +
  labs(title="2018", x="Start of week is Monday", y="") +
  expand_limits(y=c(0.5,6.5)) 

Moon Phase Calendar

This time, I tried using geom_tile function to create tiles. I’ve coloured sell using fraction (illuminated fraction of the moon). 0 is New Moon, and 1 is Full Moon. When it’s Full moon sky is lighter, so I’ve coloured cell little bit lighter.

Moon_2018_df %>% ggplot(aes(x=wkdy, y=wkn.mo)) + 
  geom_tile(alpha=0.8, aes(fill=fraction)) + 
  geom_text(aes(label=paste0(" ",day)),size=3,family="Roboto Condensed",hjust=0, color="white") +
  geom_text(aes(label=moon.font), family="Moon Phases", hjust=1, color="white", size=5) +
  facet_wrap(~mo, scales="free_x", ncol=3) +  ## So that Each Line is Quarter!
  scale_x_discrete() +
  scale_y_reverse(breaks=NULL) +
  scale_fill_viridis_c(name="Moon Illumination", option="inferno",  begin=0, end=0.25, guide="none") +  ## so that sky is darkest when there's new moon
  theme_ipsum_rc() +
  labs(title="2018 Moon Phase Calendar", x="Start of week is Monday", y="") +
  expand_limits(y=c(0.5,6.5)) +
  theme(legend.position="top")

Yet Another Calendar

Moon_2018_df %>% 
  ggplot(aes(x=day, y=fct_rev(mo))) + 
  theme_minimal(base_family="Roboto Condensed") + 
  scale_x_continuous(breaks=c(1:31), position="top") +
  geom_text(aes(label=moon.font, color=fraction),family="Moon Phases", hjust=0.5, vjust=0.5, size=8, alpha=0.5) +
  geom_text(aes(label=paste0(day,"\n",wkdy)), family="Roboto Condensed", lineheight=0.8, size=4) + 
  labs(x="", y="", title="Another Type of Calendar") +
  scale_color_viridis_c()+
  theme(legend.position="bottom")