#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