# terminator Compute Global Terminator (Day/Night) Bands ## Description Compute global terminator (day/night) bands which can be overlayed as day and night regions on a ggplot2 world map. This is an Rcpp port of a [pure R port](https://github.com/JoGall/terminator) (by @JoGall) of a JS leaflet plugin. ## What’s Inside The Tin The following functions are implemented: - `terminator`: Compute a single termiantor band - `terminator_lat_lon`: Generate a full set of terminator frames ## Installation ``` r devtools::install_github("hrbrmstr/terminator") ``` ## Usage (NOTE: If you’re trying to just knit this Rmd, remove the `eval=FALSE` bits. I didn’t want to keep generating things and was too impatient to wait for a `cache=TRUE` run). ``` r library(terminator) library(ggplot2) library(gganimate) # devtools::install_github("dgrtwo/gganimate") # current verison packageVersion("terminator") ``` ## [1] '0.1.0' Joe had an asesome idea and made a perfectly fine pure R port. This one is just a wee bit faster. ``` r microbenchmark::microbenchmark( pure_r = pure_r_terminator(as.POSIXct(Sys.Date()) + (60*60*0), -180, 190, 0.5), rcpp = terminator::terminator(as.POSIXct(Sys.Date()) + (60*60*0), -180, 190, 0.5), times=100 ) -> mb mb ## Unit: microseconds ## expr min lq mean median uq max neval ## pure_r 142373.445 157488.8415 174413.4417 173927.7860 184725.916 272773.959 100 ## rcpp 483.505 553.2455 641.8395 609.8245 692.899 2487.993 100 ``` Rather than use the built-in map data, we’ll use an `rnaturalearth` so we don’t need to mess with extended longitudes. ``` r library(ggalt) library(rnaturalearth) # ropensci/rnaturalearth world_map <- fortify(countries110) ``` ## Regions defined for each Polygons ``` r ggplot() + geom_cartogram( data=world_map, map=world_map, aes(x=long, y=lat, map_id=id), fill=NA, color="#2b2b2b" ) -> gg for (i in 0:23) { gg <- gg + geom_line( data=terminator(as.integer((as.POSIXct(Sys.Date()) + (60*60*i))), -180, 180, 0.1), aes(lon, lat), color="blue" ) } gg + coord_proj("+proj=wintri") + ggthemes::theme_map() ``` ![](README_files/figure-gfm/wintri-1.png) Animation with `magick`: ``` r library(magick) library(rnaturalearth) # ropensci/rnaturalearth library(tidyverse) world_map <- fortify(countries110, region="name") world_map <- filter(world_map, id != "Antarctica") x <- image_graph(width=1000*2, height=500*2, res=144) pb <- progress_estimated(24) for (i in 0:23) { pb$tick()$print() ggplot() + geom_cartogram( data=world_map, map=world_map, aes(x=long, y=lat, map_id=id), fill=NA, color="#2b2b2b", size=0.125 ) + geom_ribbon( data=terminator(as.integer((as.POSIXct(Sys.Date()) + (60*60*(i)))), -180, 180, 0.1), aes(lon, ymin=lat, ymax=90), fill="lightslategray", alpha=1/2 ) + scale_x_continuous(limits=c(-180, 180)) + coord_quickmap() + ggthemes::theme_map() -> gg print(gg) } dev.off() x <- image_animate(x) image_write(x, "magick-preview.gif") ``` ![](magick-preview.gif) Using Joe’s animation example: ``` r term_seq <- terminator_lat_lon() chart <- ggplot(term_seq, aes(frame = frame)) + borders("world", colour = "gray90", fill = "gray85") + geom_ribbon(aes(lon, ymax = lat), ymin = 90, alpha = 0.2) + coord_equal(xlim = c(-180, 190), ylim = c(-58, 85), expand = 0) + ggthemes::theme_map() gganimate( chart, interval = 0.1, ani.width=1000, ani.height=600, filename = "terminator-animation.gif" ) ``` ![](terminator-animation.gif)