Dynamic Plots

Author

Collin Owens

Packages

Loading required package: timechange

Attaching package: 'lubridate'
The following objects are masked from 'package:base':

    date, intersect, setdiff, union

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union

Attaching package: 'plotly'
The following object is masked from 'package:httr':

    config
The following object is masked from 'package:ggplot2':

    last_plot
The following object is masked from 'package:stats':

    filter
The following object is masked from 'package:graphics':

    layout
Loading required package: zoo

Attaching package: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric

Attaching package: 'xts'
The following objects are masked from 'package:dplyr':

    first, last
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
✔ tibble  3.1.8     ✔ purrr   0.3.5
✔ tidyr   1.2.1     ✔ stringr 1.4.1
✔ readr   2.1.3     ✔ forcats 0.5.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ lubridate::as.difftime() masks base::as.difftime()
✖ plotly::config()         masks httr::config()
✖ lubridate::date()        masks base::date()
✖ plotly::filter()         masks dplyr::filter(), stats::filter()
✖ xts::first()             masks dplyr::first()
✖ purrr::flatten()         masks jsonlite::flatten()
✖ lubridate::intersect()   masks base::intersect()
✖ dplyr::lag()             masks stats::lag()
✖ xts::last()              masks dplyr::last()
✖ lubridate::setdiff()     masks base::setdiff()
✖ lubridate::union()       masks base::union()

Setting Dataset up

LAD <- VERB("GET", url = "https://www.lostarkmarket.online/api/export-item-history/North America West/basic-oreha-fusion-material-2,crystallized-destruction-stone-0,crystallized-guardian-stone-0,great-honor-leapstone-2,honor-shard-pouch-l-3,honor-shard-pouch-m-2,honor-shard-pouch-s-1,solar-blessing-2,solar-grace-1,solar-protection-3", encode = "json")

resptxt <- content(LAD, as="text")

Converting <- fromJSON(resptxt)

LostArkData <- Converting%>%bind_rows%>%select(id,timestamp,open,close,high,low)

attach(LostArkData)

#converting nonsensical time into real dates and replacing the old ones with a real date.
Tconvert <- timestamp/1000
Newtime <- as_date(as_datetime(Tconvert))
LostArkData$timestamp <- Newtime

#Removing any price=0 because the minimum price will always be 1
LostArkData$open[LostArkData$open ==0] <- NA
LostArkData$close[LostArkData$close ==0] <- NA
LostArkData$high[LostArkData$high ==0] <- NA
LostArkData$low[LostArkData$low ==0] <- NA
LostArkData <- LostArkData[complete.cases(LostArkData), ]

#checking new length, looks like we have removed 4 observations.


#renaming first 2 columns
names(LostArkData)[1] <- "Item"
names(LostArkData)[2] <- "Date"

#renaming observations to in game names.
LostArkData$Item[LostArkData$Item == "basic-oreha-fusion-material-2"] <- "Basic Oreha"
LostArkData$Item[LostArkData$Item == "crystallized-destruction-stone-0"] <- "Destruction Stone"
LostArkData$Item[LostArkData$Item == "crystallized-guardian-stone-0"] <- "Guardian Stone"
LostArkData$Item[LostArkData$Item == "great-honor-leapstone-2"] <- "Great Honor Leapstones"
LostArkData$Item[LostArkData$Item == "honor-shard-pouch-l-3"] <- "Honor Shard L"
LostArkData$Item[LostArkData$Item == "honor-shard-pouch-m-2"] <- "Honor Shard M"
LostArkData$Item[LostArkData$Item == "honor-shard-pouch-s-1"] <- "Honor Shard S"
LostArkData$Item[LostArkData$Item == "solar-blessing-2"] <- "Solar Blessing"
LostArkData$Item[LostArkData$Item == "solar-grace-1"] <- "Solar Grace"
LostArkData$Item[LostArkData$Item == "solar-protection-3"] <- "Solar Protection"

Cleaning and separating I have to separate each data set into its own thing for the plots to play nice with eachother.

LostArkData <- LostArkData[!(LostArkData$open == 65.00 & LostArkData$high == 14899.00),]
LostArkData <- LostArkData[!(LostArkData$open == 13.00 & LostArkData$high == 2500.00),]
LostArkData <- LostArkData[!(LostArkData$open == 187.00 & LostArkData$high == 1823.00),]
LostArkData <- LostArkData[!(LostArkData$open == 1823.00 & LostArkData$high == 1823.00),]

LostArkData <- LostArkData[!(LostArkData$open == 118.00 & LostArkData$low == 11.00),]
LostArkData <- LostArkData[!(LostArkData$close == 116.00 & LostArkData$low == 11.00),]
LostArkData <- LostArkData[!(LostArkData$open == 116.00 & LostArkData$low == 11.00),]
LostArkData <- LostArkData[!(LostArkData$close == 115.00 & LostArkData$low == 11.00),]

#look at this later
LostArkData <- LostArkData %>% filter(high < 10000)




#LAGHLD is a data set for Great Honor Leapstones
LAGHLD <- LostArkData %>% filter(LostArkData$Item %in% c("Great Honor Leapstones"))

#LAOrehaD is a data set for Oreha material.
LAOrehaD <- LostArkData %>% filter(LostArkData$Item %in% c("Basic Oreha"))

#LADGD T3 Destruction and T3 Guardians
LADestructionD <- LostArkData %>% filter(LostArkData$Item %in% c("Destruction Stone"))
LAGuardianD <- LostArkData %>% filter(LostArkData$Item %in% c("Guardian Stone"))

#LARateupD is a data set for rate up materials 
LABlessingD <- LostArkData %>% filter(LostArkData$Item %in% c("Solar Blessing"))
LAGraceD <- LostArkData %>% filter(LostArkData$Item %in% c("Solar Grace"))
LAProtectionD <- LostArkData %>% filter(LostArkData$Item %in% c("Solar Protection"))

#LAShardsD is a data set for the shard packs
LALShardD <- LostArkData %>% filter(LostArkData$Item %in% c("Honor Shard L"))
LAMShardD <- LostArkData %>% filter(LostArkData$Item %in% c("Honor Shard M"))
LASShardD <- LostArkData %>% filter(LostArkData$Item %in% c("Honor Shard S"))


#Shaded regions
Shade <- data.frame(start = as.Date(c('2022-04-25','2022-05-06','2022-06-01','2022-07-12','2022-07-29','2022-09-20','2022-10-13')), end = as.Date(c('2022-04-28','2022-05-19','2022-06-30','2022-07-19','2022-08-15','2022-09-28','2022-11-16')))

Shade1 <- data.frame(start = as.Date(c('2022-07-12','2022-07-29','2022-09-20')), end = as.Date(c('2022-07-19','2022-08-15','2022-09-28')))

New Data transformation This is done for having specific date data, the old data had about 12+ observations per date but the High, Low, Close data is not displayed as nice if we do not separate the dates out.

#Great honor data
Open <- LAGHLD %>% group_by(Date) %>% slice_head()
Close <- LAGHLD %>% group_by(Date) %>% slice_tail()
Min <- LAGHLD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LAGHLD %>% group_by(Date) %>% arrange(low) %>%slice_tail
id <- 1:length(Close$close)

NGHLD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NGHLD)[1] <- "Item"
names(NGHLD)[2] <- "Date"
names(NGHLD)[3] <- "Open"
names(NGHLD)[4] <- "Close"
names(NGHLD)[5] <- "Min"
names(NGHLD)[6] <- "Max"


#Oreha
Open <- LAOrehaD %>% group_by(Date) %>% slice_head()
Close <- LAOrehaD %>% group_by(Date) %>% slice_tail()
Min <- LAOrehaD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LAOrehaD %>% group_by(Date) %>% arrange(low) %>%slice_tail
id <- 1:length(Close$close)

NOrehaD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NOrehaD)[1] <- "Item"
names(NOrehaD)[2] <- "Date"
names(NOrehaD)[3] <- "Open"
names(NOrehaD)[4] <- "Close"
names(NOrehaD)[5] <- "Min"
names(NOrehaD)[6] <- "Max"

#Destruction
Open <- LADestructionD %>% group_by(Date) %>% slice_head()
Close <- LADestructionD %>% group_by(Date) %>% slice_tail()
Min <- LADestructionD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LADestructionD %>% group_by(Date) %>% arrange(low) %>% slice_tail
id2 <- 1:length(Close$close)

NDestructionD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id2)
names(NDestructionD)[1] <- "Item"
names(NDestructionD)[2] <- "Date"
names(NDestructionD)[3] <- "Open"
names(NDestructionD)[4] <- "Close"
names(NDestructionD)[5] <- "Min"
names(NDestructionD)[6] <- "Max"

#Guardian
Open <- LAGuardianD %>% group_by(Date) %>% slice_head()
Close <- LAGuardianD %>% group_by(Date) %>% slice_tail()
Min <- LAGuardianD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LAGuardianD %>% group_by(Date) %>% arrange(low) %>%slice_tail
id2 <- 1:length(Close$close)

NGuardianD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id2)
names(NGuardianD)[1] <- "Item"
names(NGuardianD)[2] <- "Date"
names(NGuardianD)[3] <- "Open"
names(NGuardianD)[4] <- "Close"
names(NGuardianD)[5] <- "Min"
names(NGuardianD)[6] <- "Max"

#Solar Blessings
Open <- LABlessingD %>% group_by(Date) %>% slice_head()
Close <- LABlessingD %>% group_by(Date) %>% slice_tail()
Min <- LABlessingD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LABlessingD %>% group_by(Date) %>% arrange(low) %>%slice_tail

NBlessingD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NBlessingD)[1] <- "Item"
names(NBlessingD)[2] <- "Date"
names(NBlessingD)[3] <- "Open"
names(NBlessingD)[4] <- "Close"
names(NBlessingD)[5] <- "Min"
names(NBlessingD)[6] <- "Max"

#Solar Grace
Open <- LAGraceD %>% group_by(Date) %>% slice_head()
Close <- LAGraceD %>% group_by(Date) %>% slice_tail()
Min <- LAGraceD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LAGraceD %>% group_by(Date) %>% arrange(low) %>%slice_tail

NGraceD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NGraceD)[1] <- "Item"
names(NGraceD)[2] <- "Date"
names(NGraceD)[3] <- "Open"
names(NGraceD)[4] <- "Close"
names(NGraceD)[5] <- "Min"
names(NGraceD)[6] <- "Max"

#Solar Protection
Open <- LAProtectionD %>% group_by(Date) %>% slice_head()
Close <- LAProtectionD %>% group_by(Date) %>% slice_tail()
Min <- LAProtectionD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LAProtectionD %>% group_by(Date) %>% arrange(low) %>%slice_tail

NProtectionD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NProtectionD)[1] <- "Item"
names(NProtectionD)[2] <- "Date"
names(NProtectionD)[3] <- "Open"
names(NProtectionD)[4] <- "Close"
names(NProtectionD)[5] <- "Min"
names(NProtectionD)[6] <- "Max"

#Large Shards 
Open <- LALShardD %>% group_by(Date) %>% slice_head()
Close <- LALShardD %>% group_by(Date) %>% slice_tail()
Min <- LALShardD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LALShardD %>% group_by(Date) %>% arrange(low) %>%slice_tail

NLShardD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NLShardD)[1] <- "Item"
names(NLShardD)[2] <- "Date"
names(NLShardD)[3] <- "Open"
names(NLShardD)[4] <- "Close"
names(NLShardD)[5] <- "Min"
names(NLShardD)[6] <- "Max"

#Medium Shards 
Open <- LAMShardD %>% group_by(Date) %>% slice_head()
Close <- LAMShardD %>% group_by(Date) %>% slice_tail()
Min <- LAMShardD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LAMShardD %>% group_by(Date) %>% arrange(low) %>%slice_tail

NMShardD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NMShardD)[1] <- "Item"
names(NMShardD)[2] <- "Date"
names(NMShardD)[3] <- "Open"
names(NMShardD)[4] <- "Close"
names(NMShardD)[5] <- "Min"
names(NMShardD)[6] <- "Max"

#Small Shards 
Open <- LASShardD %>% group_by(Date) %>% slice_head()
Close <- LASShardD %>% group_by(Date) %>% slice_tail()
Min <- LASShardD %>% group_by(Date) %>% arrange(high) %>%slice_head
Max <- LASShardD %>% group_by(Date) %>% arrange(low) %>%slice_tail

NSShardD <- data.frame(Open$Item,Open$Date,Open$open,Close$close,Min$low,Max$high,id)
names(NSShardD)[1] <- "Item"
names(NSShardD)[2] <- "Date"
names(NSShardD)[3] <- "Open"
names(NSShardD)[4] <- "Close"
names(NSShardD)[5] <- "Min"
names(NSShardD)[6] <- "Max"

#Giant merge of single day market descriptions
NLAD <- rbind(NGHLD,NOrehaD,NBlessingD,NGraceD,NBlessingD,NProtectionD,NLShardD,NMShardD,NSShardD)
NStonesD <- rbind(NDestructionD,NGuardianD)

Regrouping for use in new GGPlot graphs These are for if I want to combine the data together for multiple items on a graph like the static graphs

#LADGD T3 Destruction, T3 Guardians
NDGD <- NStonesD %>% filter(NStonesD$Item %in% c("Destruction Stone","Guardian Stone"))

#LARateupD is a data set for rate up materials 
NRateupD <- NLAD %>% filter(NLAD$Item %in% c("Solar Blessing","Solar Grace","Solar Protection"))

#LAShardsD is a data set for the shard packs
NShardsD <- NLAD %>% filter(NLAD$Item %in% c("Honor Shard L","Honor Shard M","Honor Shard S"))

Buttons for Shading regions in the upcoming graphs.

Region1 <- list(type = 'rect', xref = 'x', yref = 'y', y0 = 0, y1 = 800, x0=Shade[1,1], x1=Shade[1,2], opacity = .2, fillcolor = "gray")
Region2 <- list(type = 'rect', xref = 'x', yref = 'y', y0 = 0, y1 = 800, x0=Shade[2,1], x1=Shade[2,2], opacity = .2, fillcolor = "gray")
Region3 <- list(type = 'rect', xref = 'x', yref = 'y', y0 = 0, y1 = 800, x0=Shade[3,1], x1=Shade[3,2], opacity = .2, fillcolor = "gray")
Region4 <- list(type = 'rect', xref = 'x', yref = 'y', y0 = 0, y1 = 800, x0=Shade[4,1], x1=Shade[4,2], opacity = .2, fillcolor = "gray")
Region5 <- list(type = 'rect', xref = 'x', yref = 'y', y0 = 0, y1 = 800, x0=Shade[5,1], x1=Shade[5,2], opacity = .2, fillcolor = "gray")
Region6 <- list(type = 'rect', xref = 'x', yref = 'y', y0 = 0, y1 = 800, x0=Shade[6,1], x1=Shade[6,2], opacity = .2, fillcolor = "gray")
Region7 <- list(type = 'rect', xref = 'x', yref = 'y', y0 = 0, y1 = 800, x0=Shade[7,1], x1=Shade[7,2], opacity = .2, fillcolor = "gray")


#Button used for highlighting specific timeframes
updatemenus <- list(
  list(
    pad = list('r'= 45, 't'= 0, 'b' = 0),
    active = -1,
    type = 'buttons',
    buttons = list(

      list(
        label = "None",
        method = "relayout",
        args = list(list(shapes = c()))),

      list(
        label = "Hyper Express 1",
        method = "relayout",
        args = list(list(shapes = list(Region1, c(),c(), c(),c(),c(),c())))),
      
      list(
        label = "May Update",
        method = "relayout",
        args = list(list(shapes = list(c(),Region2,c(), c(),c(),c(),c())))),
      
      list(
        label = "June/July Update",
        method = "relayout",
        args = list(list(shapes = list(c(),c(), Region3,c(),c(),c(),c())))),
      
      list(
        label = "Hyper Express 2",
        method = "relayout",
        args = list(list(shapes = list(c(),c(),c(),Region4,c(),c(),c())))),
      
      list(
        label = "August update",
        method = "relayout",
        args = list(list(shapes = list(c(),c(),c(), c(),c(),Region5,c(),c())))),
      
      list(
        label = "Clown update",
        method = "relayout",
        args = list(list(shapes = list(c(),c(),c(), c(),c(),c(),Region6,c())))),
      
      list(
        label = "Ark pass 2",
        method = "relayout",
        args = list(list(shapes = list(c(),c(),c(), c(),c(),c(),c(),Region7)))),
      
      list(
        label = "All",
        method = "relayout",
        args = list(list(shapes = list(c(),Region1,Region2, Region3,Region4,Region5,Region6,Region7))))
      
    )))


#Buttons for a dropdown menu of different items
dropdown <- list(
      list(
        y = 0.9,
        pad = list('r'= 45, 't'= 0, 'b' = 0),
        buttons = list(
          list(method = "restyle",
               args = list("visible", list(TRUE, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE)),
               label = "Great Honor Leapstones"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE)),
               label = "Oreha"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE)),
               label = "Destruction"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE)),
               label = "Guardian"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE)),
               label = "Small Shards"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE)),
               label = "Medium Shards"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE)),
               label = "Large Shards"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE)),
               label = "Solar Blessing"),
          
          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE)),
               label = "Solar Grace"),

          list(method = "restyle",
               args = list("visible", list(FALSE, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE)),
               label = "Solar Protection")))
)

Plotly line graph setup.

#Super Graph for fun
SuperLine <- plot_ly() %>% layout(autosize = F, width = 800, height = 500, updatemenus = updatemenus, hovermode = "x", yaxis = list(title = "Price in gold"),xaxis = list(
    rangeselector = list(
      buttons = list(
        list(
          count = 7,
          label = "1 Week",
          step = "day",
          stepmode = "backward"),
        list(
          count = 1,
          label = "1 month",
          step = "month",
          stepmode = "backward"),list(step = "all"))), 
    rangeslider = list(type = "date"))) %>%
  add_trace(x = NProtectionD$Date, y = NProtectionD$Close, type = 'scatter', mode = 'line', name = "Solar Protection", line = list(color = 'rgb(255, 153, 51)')) %>%
  add_trace(x = NBlessingD$Date, y = NBlessingD$Close, type = 'scatter', mode = 'line', name = "Solar Blessing", line = list(color = 'rgb(0, 204, 204)')) %>%
  add_trace(x = NGraceD$Date, y = NGraceD$Close, type = 'scatter', mode = 'line', name = "Solar Grace", line = list(color = 'rgb(0, 204, 102)')) %>%
  add_trace(x = NLShardD$Date, y = NLShardD$Close, type = 'scatter', mode = 'line', name = "Large pouch", line = list(color = 'rgb(255, 0, 0)')) %>%
  add_trace(x = NMShardD$Date, y = NMShardD$Close, type = 'scatter', mode = 'line', name = "Medium pouch", line = list(color = 'rgb(0, 0, 255)')) %>%
  add_trace(x = NSShardD$Date, y = NSShardD$Close, type = 'scatter', mode = 'line', name = "Small pouch", line = list(color = 'rgb(51, 102, 0)')) %>%
  add_trace(x = NOrehaD$Date, y = NOrehaD$Close, type = 'scatter', mode = 'line', name = "Oreha Material", line = list(color = 'rgb(0, 0, 0)')) %>%
  add_trace(x = NGHLD$Date, y = NGHLD$Close, type = 'scatter', mode = 'line', name = "Great Honor Leapstones", line = list(color = 'rgb(255, 0, 127)'))
Warning: Specifying width/height in layout() is now deprecated.
Please specify in ggplotly() or plot_ly()

Candlestick dropdown

Candles <- plot_ly(NLAD, x = ~Date) %>% 
  
  add_trace(data =NGHLD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min) %>%
  
  add_trace(data =NOrehaD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NDestructionD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NGuardianD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NSShardD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NMShardD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NLShardD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NBlessingD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NGraceD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  add_trace(data =NProtectionD ,x = ~Date, type="candlestick",
          open = ~Open, close = ~Close,
          high = ~Max, low = ~Min, visible = F) %>%
  
  layout(updatemenus = dropdown, hovermode = "x", yaxis = list(title = "Price in gold"),xaxis = list(
    rangeselector = list(
      buttons = list(
        list(
          count = 7,
          label = "1 Week",
          step = "day",
          stepmode = "backward"),
        list(
          count = 1,
          label = "1 month",
          step = "month",
          stepmode = "backward"),list(step = "all"))), 
    rangeslider = list(type = "date")))

Candlestick graph

This graph is a “For fun” graph but can be used alongside the final graph. This candlestick graph was built from slicing data earlier to only provide the highest price, lowest price, closing price, and opening price for the day and condensing it in 1 row. I was not able to figure out how to combine this with the dates, but using the SuperLine graph and the dates pasted below, you can see the dates and hover over them with your mouse if you wished.

Candles

Plotly Line Graphs with shaded regions and Candlestick graph with dropdown option

This is the final graph.

SuperLine
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...

Hyper express 1

4/25 express mission announced for leveling characters. https://forums.playlostark.com/t/update-to-the-express-mission-event/349957

4/28 express mission applied https://forums.playlostark.com/t/lost-ark-weekly-update-428-12-am-pt-7-am-utc-9-am-cest/351443 This was when the data began to be tracked by volunteers. This was also the same time when Amazon announced an event called “Hyper express” which made it easier to level your character.

May Update

5/6 May update announced https://www.playlostark.com/en-us/news/articles/may-2022-update-reveal

5/19 May update released https://www.playlostark.com/en-us/news/articles/may-2022-release-notes This was when they announced the first “legion raid” boss and a daily boss that doubles the Great Honor Leapstone supply for characters who can fight it.

June/July Update

6/1 June/July update announced (new character announced too) https://www.playlostark.com/en-us/news/articles/june-and-july-2022-roadmap

6/1 Anti bot measures for dungeons https://forums.playlostark.com/t/lost-ark-weekly-update-june-2nd-12-am-pt-7-am-utc-9-am-cest/396600

6/30 June update applied https://www.playlostark.com/en-us/news/articles/wrath-of-the-covetous-legion-release-notes This is when they introduced the second “legion raid” boss while also introducing anti botting measures.

6/22 June update delayed https://forums.playlostark.com/t/regarding-the-june-update/417483

6/24 A bit more anti bot measures https://forums.playlostark.com/t/an-update-to-fraud-prevention-in-lost-ark/419449 They announced the June update will be delayed, adding another week for people to hit their goals.

Hyper express 2

7/12 hyper express + new class confirmation date https://www.playlostark.com/en-gb/news/articles/arcanist-academy

7/19 Release of hyper express and arcana https://www.playlostark.com/en-us/news/articles/spells-in-spades-release-notes They announced the hyper express mission and a new character, leading you to level another character very fast and easily.

7/30 Vykas release https://www.playlostark.com/en-us/news/articles/wrath-of-the-covetous-legion-release-notes

Powerpass disabled

7/26 power passes disabled https://forums.playlostark.com/t/powerpasses-temporarily-disabled/439652 Due to botting, they disabled power passes to try and fix the market

August/September update

7/29 August September roadmap announced https://www.playlostark.com/en-us/news/articles/august-september-2022-roadmap They announce the August and September roadmap, unfortunately August’s update had nothing really important in the game.

8/15 August update applied, pet ranch and powerpass enabled. https://forums.playlostark.com/t/update-to-disabled-powerpasses/449952 The August update was applied, but they also re enabled the powerpasses so people can now level a character to a high level easily again.

24 hours downtime

9/7 almost 24 hours of downtime https://twitter.com/playlostark/status/1567522574292189185 The game went down for 24 hours due to some bug. Prices for Red stones became strange for about 2 days.

September/Clown Update

9/20 New class and boss confirmation date https://twitter.com/playlostark/status/1572256100841590784 They announce the new classes release date, which should also bring a new boss.

Scouter release

9/27 Scouter and clown release. https://www.playlostark.com/en-us/news/articles/rage-with-the-machinist-release-notes

November/December

update announcement 10/3 Brelshaza announced

Ark pass 2

10/13 Another event to boost the ilevel of characters.

Reaper

11/16 Reaper released with a gold sink to try and deflate the economy. Hyper express for a fast track to 1445 also released.