Filtering using Crosstalk on a converted time-series ggplot. (no shiny)

Viewed 182

I've got a dataset with the following structure (data=historic):

structure(list(date = c("23-03-2019", "23-03-2019", "23-03-2019", 
"23-03-2019", "05-05-2020", "05-05-2020", "05-05-2020", "05-05-2020", 
"17-06-2021", "17-06-2021", "17-06-2021", "17-06-2021"), cumvol = c(0.004, 
0.034, 0.054, 0.057, 0.005, 0.048, 0.068, 0.075, 2.009, 2.029, 
2.049, 2.064), time = structure(c(26457, 26636, 26658, 27216, 
25152, 25614, 25667, 25668, 56966, 57268, 57303, 58986), units = "secs", class = c("hms", 
"difftime")), Year = c("2019", "2019", "2019", "2019", "2020", 
"2020", "2020", "2020", "2021", "2021", "2021", "2021"))

On top of this I am plotting data from a separate df:

structure(list(date = structure(c(19038, 19038, 19038, 19038), class = "Date"), 
cumvol = c(0.029, 0.034, 0.07, 0.075), time = structure(c(29674, 29674, 29691, 29719), 
class = c("hms", "difftime"), units = "secs")), Year = c("2022", "2022", "2022", "2022"))

Using ggplot and plotly I produce a pretty simple line chart that highlights the recent data vs historical data that I then convert to plotly.

plot <- ggplot()+geom_line(data=historic,aes(x=time, y=cumvol, group=date),color='#BAB0AC', alpha=0.5)+
      geom_line(data=recent,aes(x=time, y=cumvol, group=date),size=1.2,color='#E15758')+
      geom_point(data=most_recent, aes(x=time,y=cumvol), color='#E15759',size=3)+geom_hline(yintercept = 0)+  theme(title=element_text(size=12),panel.background = element_rect(fill='white',color='black'),legend.position='right')+
        labs(title = "Vol",subtitle = "Cum Vol so far", x = "Time", y = "Vol")
    
    chart <- plotly::ggplotly(plot)

I'd like to add a bit of functionality using crosstalk's filtering function (found here: https://rstudio.github.io/crosstalk/using.html) to allow users to filter by "Year" and by "date", but I don't want to lose the most recent data plotted over the top.

I think I need to apply filters like this to the 'chart' object like so:

bscols(widths = c(3, 9),
       list(
filter_checkbox(id = "Year", label = "Year", group = ~Year)
filter_select(id = "date", label = "Date", group = ~date), chart))

I want users to be able to filter the 'Year' via a filter_checkbox, but filter individual days using filter_select. But that's not really working out.

I've also tried converting the data using the SharedData function of Crosstalk, though there are two points of added complexity because the Crosstalk guidance seems to assume that the chart has been generated direct from plotly. It also makes it difficult because my chart is generated from two very separate dataframes.

I was wondering if anyone knew how to solve my issue(s)?

0 Answers
Related