rdygraphs

Add secondary axis as a line chart to DY graphs in R


I was able to get the bar plots with the below code. However I am trying to add secondary axis to Semi-Final column as a line chart. Can we add this ?

mobility_aus_sum <- structure(list(Year = c(2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                                            2020, 2020, 2020, 2020, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 
                                            2021, 2021, 2021, 2021, 2021, 2022, 2022), mon_day = c("April", 
                                                                                                   "August", "December", "February", "July", "June", "March", "May", 
                                                                                                   "November", "October", "September", "April", "August", "December", 
                                                                                                   "February", "January", "July", "June", "March", "May", "November", 
                                                                                                   "October", "September", "February", "January"), Final = c(-1483, 
                                                                                                                                                             -912, -405, -232, -698, -739, -633, -1125, -540, -738, -802, 
                                                                                                                                                             -482, -1012, -260, -607, -677, -827, -549, -509, -440, -326, 
                                                                                                                                                             -659, -871, -480, -639), `Semi-Final` = c(-1333, -762, -255, 
                                                                                                                                                                                                         -82, -548, -589, -483, -975, -390, -588, -652, -332, -862, -110, 
                                                                                                                                                                                                         -457, -527, -677, -399, -359, -290, -176, -509, -721, -330, -489
                                                                                                                                                             )), row.names = c(NA, -25L), groups = structure(list(Year = c(2020, 
                                                                                                                                                                                                                           2021, 2022), .rows = structure(list(1:11, 12:23, 24:25), ptype = integer(0), class = c("vctrs_list_of", 
                                                                                                                                                                                                                                                                                                                  "vctrs_vctr", "list"))), row.names = c(NA, 3L), class = c("tbl_df", 
                                                                                                                                                                                                                                                                                                                                                                            "tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
                                                                                                                                                                                                                                                                                                                                                                                                                           "tbl_df", "tbl", "data.frame"))
dates <- with(mobility_aus_sum, as.Date(paste(Year, mon_day, 1), "%Y %B %d"))
df2 <- mobility_aus_sum[order(dates),]
df3 <- ts(df2$Final, start = c(df2$Year[1], match(df2$mon_day[1], month.name)), 
          frequency = 12)

dygraph(df3) %>%
  dyRangeSelector() %>%
  dyBarChart()

Solution

  • You may try(You need to download barseries.js)

    library(dplyr)
    library(dygraphs)
    library(tibble)
    dyBarSeries <- function(dygraph, name, ...) {
      file <- "D:/barseries.js" #you need to link to the downloaded file
      plotter_ <- paste0(readLines(file, skipNul = T), collapse = "\n")
      
      dots <- list(...)
      do.call('dySeries', c(list(dygraph = dygraph, name = name, plotter = 
                                   plotter_), dots))
      
    }
    
    mobility_aus_sum %>%
      mutate(mon_day = match(mon_day, month.name)) %>%
      rowwise %>%
      mutate(dates = paste0(c(Year, mon_day, 1), collapse = "-")) %>%
      mutate(dates = as.Date(dates, "%Y-%m-%d"))  %>%
      ungroup %>%
      select(-mon_day, -Year) %>% 
      column_to_rownames(var = 'dates') %>%
      dygraph(.) %>%
      dyAxis("y", label = "Final", valueRange = c(-1500, -200), independentTicks = TRUE) %>%
      dyAxis("y2", label = "Semi-Final ", valueRange = c(-1400, 0), independentTicks = TRUE) %>%
      dyBarSeries("Final") %>%
      dySeries("Semi-Final", axis=('y2')) %>%
      dyRangeSelector() 
    

    enter image description here