Craig F. Barrett
April 07, 2021
Department of Biology
West Virginia University
Morgantown, WV USA 26506

# install packages if needed
# install.packages(c("rgbif", "knitr", "ggplot2", "tidyverse", "gganimate", "ggthemes", "sf", "tools", "maps", "rnaturalearth", "rnaturalearthdata"))

# load libraries
library(shiny)
library(ggplot2)
library(tidyverse)
library(gganimate)
library(ggthemes)
library(sf)
library("tools")
library(maps)
library("rnaturalearth")
library("rnaturalearthdata")
library(knitr)
#read in data, convert to data.frame, set "awn" as a factor
setwd(choose.dir())
awn <- read.csv("awndatanew.csv")
awn <- data.frame(awn)
# remove duplicate records based on latitude
awn <- awn %>% distinct(decimalLatitude, .keep_all = TRUE)
awns <- as.factor(awn$awn)
awn <- data.frame(awn)
world <- ne_countries(scale = "medium", returnclass = "sf")
## class(world)
states <- st_as_sf(map("state", plot = FALSE, fill = TRUE))
## head(states)
states <- cbind(states, st_coordinates(st_centroid(states)))

#Generate the map and coordinate boundaries
usa <- ggplot(data = world) +
    #mutate(year = as.numeric(awn$year)) + 
    geom_sf(data = states, fill = NA) + 
    coord_sf(xlim = c(-96, -70), ylim = c(28, 45), expand = FALSE)

# map the occurrence data
JSmap <- usa +
  geom_point(data = awn, shape = 21, colour="black", aes(x=decimalLongitude, y=decimalLatitude, fill=awns), size=6, stroke=1) +
  #transition_states(year, transition_length = 1, state_length = 1) + 
  scale_fill_manual(values=c("red", "blue")) +
  transition_time(year) +
  labs(title = 'Digitized herbarium records of Microstegium vimineum', subtitle = 'Year: {round(frame_time,0)}') +
  shadow_mark()
#animate!
JSmap
#save animation as a .gif
  anim_save("Js_awn_map_red_blue.gif", JSmap)
include_graphics("Js_awn_map_red_blue.gif")

Animation

LS0tDQp0aXRsZTogIkFuaW1hdGlvbiAoZ2dhbmltYXRlKSBhbmQgaW50ZXJhY3RpdmUgbGVhZmxldCBtYXAgb2YgSmFwYW5lc2Ugc3RpbHRncmFzcyBpbnZhc2lvbiBoaXN0b3J5IGluIFIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQpDcmFpZyBGLiBCYXJyZXR0PGJyPg0KQXByaWwgMDcsIDIwMjE8YnI+DQpEZXBhcnRtZW50IG9mIEJpb2xvZ3k8YnI+DQpXZXN0IFZpcmdpbmlhIFVuaXZlcnNpdHk8YnI+DQpNb3JnYW50b3duLCBXViBVU0EgMjY1MDY8YnI+DQpjZmIwMDAxQG1haWwud3Z1LmVkdTxicj4NCg0KYGBge3J9DQojIGluc3RhbGwgcGFja2FnZXMgaWYgbmVlZGVkDQojIGluc3RhbGwucGFja2FnZXMoYygicmdiaWYiLCAia25pdHIiLCAiZ2dwbG90MiIsICJ0aWR5dmVyc2UiLCAiZ2dhbmltYXRlIiwgImdndGhlbWVzIiwgInNmIiwgInRvb2xzIiwgIm1hcHMiLCAicm5hdHVyYWxlYXJ0aCIsICJybmF0dXJhbGVhcnRoZGF0YSIpKQ0KDQojIGxvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeSgidG9vbHMiKQ0KbGlicmFyeShtYXBzKQ0KbGlicmFyeSgicm5hdHVyYWxlYXJ0aCIpDQpsaWJyYXJ5KCJybmF0dXJhbGVhcnRoZGF0YSIpDQpsaWJyYXJ5KGtuaXRyKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KI3JlYWQgaW4gZGF0YSwgY29udmVydCB0byBkYXRhLmZyYW1lLCBzZXQgImF3biIgYXMgYSBmYWN0b3INCnNldHdkKGNob29zZS5kaXIoKSkNCmF3biA8LSByZWFkLmNzdigiYXduZGF0YW5ldy5jc3YiKQ0KYXduIDwtIGRhdGEuZnJhbWUoYXduKQ0KYGBgDQoNCmBgYHtyfQ0KIyByZW1vdmUgZHVwbGljYXRlIHJlY29yZHMgYmFzZWQgb24gbGF0aXR1ZGUNCmF3biA8LSBhd24gJT4lIGRpc3RpbmN0KGRlY2ltYWxMYXRpdHVkZSwgLmtlZXBfYWxsID0gVFJVRSkNCmF3bnMgPC0gYXMuZmFjdG9yKGF3biRhd24pDQphd24gPC0gZGF0YS5mcmFtZShhd24pDQoNCmBgYA0KYGBge3J9DQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0KIyMgY2xhc3Mod29ybGQpDQpzdGF0ZXMgPC0gc3RfYXNfc2YobWFwKCJzdGF0ZSIsIHBsb3QgPSBGQUxTRSwgZmlsbCA9IFRSVUUpKQ0KIyMgaGVhZChzdGF0ZXMpDQpzdGF0ZXMgPC0gY2JpbmQoc3RhdGVzLCBzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChzdGF0ZXMpKSkNCg0KI0dlbmVyYXRlIHRoZSBtYXAgYW5kIGNvb3JkaW5hdGUgYm91bmRhcmllcw0KdXNhIDwtIGdncGxvdChkYXRhID0gd29ybGQpICsNCiAgICAjbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKGF3biR5ZWFyKSkgKyANCiAgICBnZW9tX3NmKGRhdGEgPSBzdGF0ZXMsIGZpbGwgPSBOQSkgKyANCiAgICBjb29yZF9zZih4bGltID0gYygtOTYsIC03MCksIHlsaW0gPSBjKDI4LCA0NSksIGV4cGFuZCA9IEZBTFNFKQ0KDQoNCmBgYA0KYGBge3J9DQojIG1hcCB0aGUgb2NjdXJyZW5jZSBkYXRhDQpKU21hcCA8LSB1c2EgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBhd24sIHNoYXBlID0gMjEsIGNvbG91cj0iYmxhY2siLCBhZXMoeD1kZWNpbWFsTG9uZ2l0dWRlLCB5PWRlY2ltYWxMYXRpdHVkZSwgZmlsbD1hd25zKSwgc2l6ZT02LCBzdHJva2U9MSkgKw0KICAjdHJhbnNpdGlvbl9zdGF0ZXMoeWVhciwgdHJhbnNpdGlvbl9sZW5ndGggPSAxLCBzdGF0ZV9sZW5ndGggPSAxKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygicmVkIiwgImJsdWUiKSkgKw0KICB0cmFuc2l0aW9uX3RpbWUoeWVhcikgKw0KICBsYWJzKHRpdGxlID0gJ0RpZ2l0aXplZCBoZXJiYXJpdW0gcmVjb3JkcyBvZiBNaWNyb3N0ZWdpdW0gdmltaW5ldW0nLCBzdWJ0aXRsZSA9ICdZZWFyOiB7cm91bmQoZnJhbWVfdGltZSwwKX0nKSArDQogIHNoYWRvd19tYXJrKCkNCg0KYGBgDQpgYGB7cn0NCiNhbmltYXRlIQ0KSlNtYXANCg0KYGBgDQpgYGB7cn0NCiNzYXZlIGFuaW1hdGlvbiBhcyBhIC5naWYNCiAgYW5pbV9zYXZlKCJKc19hd25fbWFwX3JlZF9ibHVlLmdpZiIsIEpTbWFwKQ0KaW5jbHVkZV9ncmFwaGljcygiSnNfYXduX21hcF9yZWRfYmx1ZS5naWYiKQ0KYGBgDQohW0FuaW1hdGlvbl0oSnNfYXduX21hcF9yZWRfYmx1ZS5naWYp