#Function -> price.ani_ag
#not given same name as using animation package also to get the data 
price.ani_ag = function(
  price, time, time.begin = min(time), span = 15 * 60, ..., xlab = 'price',
  ylab = 'frequency', xlim, ylim, main
) {
  time1 = time.begin
  miss.main = missing(main)
  tab.max = 0
  
  #{snipet1:}
  while (time1 < max(time)) {
    time2 = time1 + span
    sub.price = price[time >= time1 & time <= time2]
    if (length(sub.price) > 0) {
      tab.max = max(tab.max, max(table(sub.price)))
    }
    time1 = time2
  }
  if (missing(xlim))
    xlimit = range(price)
  if (missing(ylim))
    ylimit = c(0, tab.max)
  
  #{snipet2: creating dataframe}
  time1 = time.begin
  i <- 1
  full_dat <- data.frame()
  time_data <- data.frame()
  while (time1<max(time)) {
    time2 = time1 + span
    sub.price<-price[time>=time1 & time<=time2]
    if (length(sub.price)>0) {
      tab.price <- table(sub.price)
      count = length(tab.price)
      sub.iteration <- vector(length = count, mode = "numeric")
      sub.iteration <- sub.iteration + 1
      temp_df<-data.frame(tab.price, iteration=sub.iteration*i)
      full_dat<-rbind(full_dat, temp_df)
      if(miss.main) {
        main = paste(time1, time2, sep = ' - ')
        temp_df_name <- data.frame(main, iteration = i)
        time_data <- rbind(time_data, temp_df_name)
      }
      i <- i + 1
    }
    
    time1 = time2
  }
  invisible(list(full_data = full_dat, dur_data = time_data, xl = xlimit, yl = ylimit))
}
library(animation)
df <- vanke1127
full_data <- price.ani_ag(df$price, df$time)$full_data
#convert sub.price to numeric for axis
full_data$sub.price = as.numeric(levels(full_data$sub.price))[full_data$sub.price]
time_data <- price.ani_ag(df$price, df$time)$dur_data
xlimit <- price.ani_ag(df$price, df$time)$xl
ylimit <- price.ani_ag(df$price, df$time)$yl
#plotting using animint
library(animint2)
mid_x = (xlimit[1] + xlimit[2])/2
theme_config = theme(plot.background = element_rect(fill = "lightsteelblue", colour = "red"), plot.title = element_text(size = 20, face="bold", hjust = 0.5), 
        plot.caption = element_text(size = 10), 
        axis.text.x = element_text(size = 5, angle=30, hjust = 0.5), 
        axis.text.y = element_text(size=10, angle = 30), 
        panel.background = element_rect(fill = "lightsteelblue2"),
        panel.grid.major = element_line(linetype = "dashed"),
        panel.grid.minor = element_blank())  
gg <- ggplot(full_data)  + geom_point(data=full_data,  aes(x = sub.price, y=Freq), showSelected.variable=full_data$iteration) + 
  geom_segment(data=full_data, aes(x = sub.price, xend = sub.price, y = Freq, yend = 0), showSelected.variable=full_data$iteration) + 
  geom_text(data=time_data, aes(x = mid_x, y = ylimit[2] + 2, label = main), showSelected.variable = full_data$iteration) + coord_cartesian(xlim = xlimit, ylim = c(ylimit[1], ylimit[2] + 2)) + scale_x_continuous(breaks=seq(xlimit[1], xlimit[2], 0.1)) + scale_y_continuous(breaks=seq(ylimit[1], ylimit[2] + 2, 5)) + theme_config + ggtitle("Frequency of Prices") + xlab("price") + ylab("Frequency")
viz <- list(plot = gg, 
            time = list(variable = "iteration", ms = 1000), 
            title = "frequency of stock prices")
animint2dir(viz, out.dir = "price.ani animint2")
Error in animint2dir(viz, out.dir = "price.ani animint2") : 
  no interactive aes for time variable iteration
animint2gist(viz, out.dir = "grad.desc")
Error in animint2dir(plot.list, open.browser = FALSE, ...) : 
  no interactive aes for time variable iteration
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpgYGB7cn0KI0Z1bmN0aW9uIC0+IHByaWNlLmFuaV9hZwojbm90IGdpdmVuIHNhbWUgbmFtZSBhcyB1c2luZyBhbmltYXRpb24gcGFja2FnZSBhbHNvIHRvIGdldCB0aGUgZGF0YSAKcHJpY2UuYW5pX2FnID0gZnVuY3Rpb24oCiAgcHJpY2UsIHRpbWUsIHRpbWUuYmVnaW4gPSBtaW4odGltZSksIHNwYW4gPSAxNSAqIDYwLCAuLi4sIHhsYWIgPSAncHJpY2UnLAogIHlsYWIgPSAnZnJlcXVlbmN5JywgeGxpbSwgeWxpbSwgbWFpbgopIHsKICB0aW1lMSA9IHRpbWUuYmVnaW4KICBtaXNzLm1haW4gPSBtaXNzaW5nKG1haW4pCiAgdGFiLm1heCA9IDAKICAKICAje3NuaXBldDE6fQogIHdoaWxlICh0aW1lMSA8IG1heCh0aW1lKSkgewogICAgdGltZTIgPSB0aW1lMSArIHNwYW4KICAgIHN1Yi5wcmljZSA9IHByaWNlW3RpbWUgPj0gdGltZTEgJiB0aW1lIDw9IHRpbWUyXQogICAgaWYgKGxlbmd0aChzdWIucHJpY2UpID4gMCkgewogICAgICB0YWIubWF4ID0gbWF4KHRhYi5tYXgsIG1heCh0YWJsZShzdWIucHJpY2UpKSkKICAgIH0KICAgIHRpbWUxID0gdGltZTIKICB9CgogIGlmIChtaXNzaW5nKHhsaW0pKQogICAgeGxpbWl0ID0gcmFuZ2UocHJpY2UpCiAgaWYgKG1pc3NpbmcoeWxpbSkpCiAgICB5bGltaXQgPSBjKDAsIHRhYi5tYXgpCiAgCiAgI3tzbmlwZXQyOiBjcmVhdGluZyBkYXRhZnJhbWV9CiAgdGltZTEgPSB0aW1lLmJlZ2luCiAgaSA8LSAxCiAgZnVsbF9kYXQgPC0gZGF0YS5mcmFtZSgpCiAgdGltZV9kYXRhIDwtIGRhdGEuZnJhbWUoKQogIHdoaWxlICh0aW1lMTxtYXgodGltZSkpIHsKICAgIHRpbWUyID0gdGltZTEgKyBzcGFuCiAgICBzdWIucHJpY2U8LXByaWNlW3RpbWU+PXRpbWUxICYgdGltZTw9dGltZTJdCiAgICBpZiAobGVuZ3RoKHN1Yi5wcmljZSk+MCkgewogICAgICB0YWIucHJpY2UgPC0gdGFibGUoc3ViLnByaWNlKQogICAgICBjb3VudCA9IGxlbmd0aCh0YWIucHJpY2UpCiAgICAgIHN1Yi5pdGVyYXRpb24gPC0gdmVjdG9yKGxlbmd0aCA9IGNvdW50LCBtb2RlID0gIm51bWVyaWMiKQogICAgICBzdWIuaXRlcmF0aW9uIDwtIHN1Yi5pdGVyYXRpb24gKyAxCiAgICAgIHRlbXBfZGY8LWRhdGEuZnJhbWUodGFiLnByaWNlLCBpdGVyYXRpb249c3ViLml0ZXJhdGlvbippKQogICAgICBmdWxsX2RhdDwtcmJpbmQoZnVsbF9kYXQsIHRlbXBfZGYpCiAgICAgIGlmKG1pc3MubWFpbikgewogICAgICAgIG1haW4gPSBwYXN0ZSh0aW1lMSwgdGltZTIsIHNlcCA9ICcgLSAnKQogICAgICAgIHRlbXBfZGZfbmFtZSA8LSBkYXRhLmZyYW1lKG1haW4sIGl0ZXJhdGlvbiA9IGkpCiAgICAgICAgdGltZV9kYXRhIDwtIHJiaW5kKHRpbWVfZGF0YSwgdGVtcF9kZl9uYW1lKQogICAgICB9CiAgICAgIGkgPC0gaSArIDEKICAgIH0KICAgIAogICAgdGltZTEgPSB0aW1lMgogIH0KICBpbnZpc2libGUobGlzdChmdWxsX2RhdGEgPSBmdWxsX2RhdCwgZHVyX2RhdGEgPSB0aW1lX2RhdGEsIHhsID0geGxpbWl0LCB5bCA9IHlsaW1pdCkpCn0KYGBgCgpgYGB7cn0KbGlicmFyeShhbmltYXRpb24pCmRmIDwtIHZhbmtlMTEyNwpmdWxsX2RhdGEgPC0gcHJpY2UuYW5pX2FnKGRmJHByaWNlLCBkZiR0aW1lKSRmdWxsX2RhdGEKI2NvbnZlcnQgc3ViLnByaWNlIHRvIG51bWVyaWMgZm9yIGF4aXMKZnVsbF9kYXRhJHN1Yi5wcmljZSA9IGFzLm51bWVyaWMobGV2ZWxzKGZ1bGxfZGF0YSRzdWIucHJpY2UpKVtmdWxsX2RhdGEkc3ViLnByaWNlXQp0aW1lX2RhdGEgPC0gcHJpY2UuYW5pX2FnKGRmJHByaWNlLCBkZiR0aW1lKSRkdXJfZGF0YQp4bGltaXQgPC0gcHJpY2UuYW5pX2FnKGRmJHByaWNlLCBkZiR0aW1lKSR4bAp5bGltaXQgPC0gcHJpY2UuYW5pX2FnKGRmJHByaWNlLCBkZiR0aW1lKSR5bApgYGAKCmBgYHtyfQojcGxvdHRpbmcgdXNpbmcgYW5pbWludApsaWJyYXJ5KGFuaW1pbnQyKQoKbWlkX3ggPSAoeGxpbWl0WzFdICsgeGxpbWl0WzJdKS8yCgp0aGVtZV9jb25maWcgPSB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJsaWdodHN0ZWVsYmx1ZSIsIGNvbG91ciA9ICJyZWQiKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuNSksIAogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGU9MzAsIGhqdXN0ID0gMC41KSwgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgYW5nbGUgPSAzMCksIAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJsaWdodHN0ZWVsYmx1ZTIiKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRhc2hlZCIpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICAKCmdnIDwtIGdncGxvdChmdWxsX2RhdGEpICArIGdlb21fcG9pbnQoZGF0YT1mdWxsX2RhdGEsICBhZXMoeCA9IHN1Yi5wcmljZSwgeT1GcmVxKSwgc2hvd1NlbGVjdGVkLnZhcmlhYmxlPWZ1bGxfZGF0YSRpdGVyYXRpb24pICsgCiAgZ2VvbV9zZWdtZW50KGRhdGE9ZnVsbF9kYXRhLCBhZXMoeCA9IHN1Yi5wcmljZSwgeGVuZCA9IHN1Yi5wcmljZSwgeSA9IEZyZXEsIHllbmQgPSAwKSwgc2hvd1NlbGVjdGVkLnZhcmlhYmxlPWZ1bGxfZGF0YSRpdGVyYXRpb24pICsgCiAgZ2VvbV90ZXh0KGRhdGE9dGltZV9kYXRhLCBhZXMoeCA9IG1pZF94LCB5ID0geWxpbWl0WzJdICsgMiwgbGFiZWwgPSBtYWluKSwgc2hvd1NlbGVjdGVkLnZhcmlhYmxlID0gZnVsbF9kYXRhJGl0ZXJhdGlvbikgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IHhsaW1pdCwgeWxpbSA9IGMoeWxpbWl0WzFdLCB5bGltaXRbMl0gKyAyKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSh4bGltaXRbMV0sIHhsaW1pdFsyXSwgMC4xKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSh5bGltaXRbMV0sIHlsaW1pdFsyXSArIDIsIDUpKSArIHRoZW1lX2NvbmZpZyArIGdndGl0bGUoIkZyZXF1ZW5jeSBvZiBQcmljZXMiKSArIHhsYWIoInByaWNlIikgKyB5bGFiKCJGcmVxdWVuY3kiKQoKCnZpeiA8LSBsaXN0KHBsb3QgPSBnZywgCiAgICAgICAgICAgIHRpbWUgPSBsaXN0KHZhcmlhYmxlID0gIml0ZXJhdGlvbiIsIG1zID0gMTAwMCksIAogICAgICAgICAgICB0aXRsZSA9ICJmcmVxdWVuY3kgb2Ygc3RvY2sgcHJpY2VzIikKYGBgCgoKYGBge3J9CmFuaW1pbnQyZGlyKHZpeiwgb3V0LmRpciA9ICJwcmljZS5hbmkgYW5pbWludDIiKQpgYGAKCmBgYHtyfQphbmltaW50Mmdpc3Qodml6LCBvdXQuZGlyID0gImdyYWQuZGVzYyIpCmBgYAoK