Skip to contents

This vignette presents some vital aspects of time zones when adding ‘hourglass’ layers to your plot

## load required namespaces for this vignette
library(ggplot2)
library(gghourglass)
library(dplyr)
library(lubridate)

Whether it’s day or night depends on where you are on the Earth’s globe. This is why you need to pass the longitude and latitude when you wish to decorate your plot with ribbons indicating night (or day) time.

But which hour of the day is it anyway? Well, that of course depends on the time zone that you use as a reference. The ?bats dataset, included with the gghourglass package, expresses the date and time in Coordinated Universal Time (UTC). This makes sense when your observations are close to the prime meridian, but not so much when you are in a different time zone (such as the Central Time Zone in the United States).

Let’s make this more clear through an example. We start by plotting the provided observations of bat call sequences:

## get example data
data(bats)

## subset example date to the year 2018
bats_sub <- subset(bats, format(RECDATETIME, "%Y") == "2019")

## retrieve monitoring location
lon <- attr(bats, "monitoring")$longitude[1]
lat <- attr(bats, "monitoring")$latitude[1]

## plot the data
p <-
  ggplot(bats_sub, aes(x = RECDATETIME)) +
  
    ## annotate sunset until sunrise
    annotate_daylight(lon, lat, c("sunset", "sunrise")) +
  
    ## annotate dusk until dawn
    annotate_daylight(lon, lat, c("dusk", "dawn")) +
  
    ## add hourglass geometry to plot
    geom_hourglass() +
  
    ## add informative labels
    labs(x = "Date", y = "Time of day")
p

Note that the geom_hourglass() layer automatically uses the time zone as specified by the data (UTC). If you wish to display it in a different time zone, such as for instance Central European Time (CET), you simply mutate the time zone of the observations with lubridate::with_tz():

p %+%
  mutate(bats_sub, RECDATETIME = with_tz(RECDATETIME, "CET"))
#> Warning:  You are displaying a timezone that uses daylight saving time.
#> It may contain ambiguous time stamps.
#>  Convert the object to a time zone without daylight time (e.g. 'UTC').
#> You can use `lubridate::with_tz()`.
#>  You are displaying a timezone that uses daylight saving time.
#> It may contain ambiguous time stamps.
#>  Convert the object to a time zone without daylight time (e.g. 'UTC').
#> You can use `lubridate::with_tz()`.

Hold on, why is the ribbon indicating night time jagged? This is because CET has summer daylight-saving time which causes the night-time to shift one hour.