EN VI

Plotly hover text/tooltip not working in Shiny?

2024-03-13 22:00:08
How to Plotly hover text/tooltip not working in Shiny

I have a Shiny app to do customised charts. I do them with ggplot and then convert them to a Plotly object so they are interactive. The problem I have with the area chart, is that when people hover over the plot, it shows the values of each of the variables only for the first data point, across the whole chart.

I have created a column in my data that is called "hover_text" and this contains what I want to show for each data point when hovering. I have then passed this in the aes, text argument in my ggplot object (I have also tried adding it in the aes of geom_area but still doesn't work). After that, I add the tooltip = "text" argument in ggplotly but this returns an empty chart.

This is an example of my data (you can find the data using dput at the end of the post):

 OBS        GroupBy   AVP hover_text                            
    <date>     <chr>   <dbl> <chr>                                 
  1 2013-01-05 all      66.6 OBS:2013-01-05 Value:66.55 GroupBy:all
  2 2013-01-12 all      66.7 OBS:2013-01-12 Value:66.74 GroupBy:all
  3 2013-01-19 all      63.7 OBS:2013-01-19 Value:63.72 GroupBy:all
  4 2013-01-26 all      64.6 OBS:2013-01-26 Value:64.62 GroupBy:all
  5 2013-02-02 all      68.4 OBS:2013-02-02 Value:68.37 GroupBy:all
  6 2013-02-09 all      76.9 OBS:2013-02-09 Value:76.94 GroupBy:all
  7 2013-02-16 all      70.2 OBS:2013-02-16 Value:70.16 GroupBy:all
  8 2013-02-23 all      69.8 OBS:2013-02-23 Value:69.78 GroupBy:all
  

This is the code that returns an empty chart:

library(shiny)
library(plotly)
library(dplyr)
library(ggplot2)

# Function for plot

AreaPlot <- function(data = data,
                     y1 = "AVP",
                     date_brks_area = "1 month",
                     topn = 10,
                     x_label_area = "",
                     y_label_area = "",
                     x_axis_area = "%Y-%m-%d",
                     overlap = FALSE,
                     alpha = 1) {
  gdata <- data
  gdata[[y1]][is.na(gdata[[y1]])] <- 0
  
  if (is.na(min(gdata$OBS))) {
    stop("")
  }
  
  brks <- seq(
    from = as.Date(min(gdata$OBS)),
    to = as.Date(max(gdata$OBS)),
    by = date_brks_area
  )
  
  group_levels <- gdata %>%
    group_by(GroupBy) %>%
    summarise(Value = sum(!!rlang::sym({{ y1 }}), na.rm = TRUE)) %>%
    ungroup() %>%
    arrange(Value) %>%
    filter(Value != 0) %>%
    top_n(topn) %>%
    select(GroupBy)
  
  gdata <- gdata %>%
    mutate(
      GroupBy = ifelse(
        GroupBy %in% t(group_levels),
        GroupBy,
        "Other"
      )
    )
  
  gdata <- gdata %>%
    group_by(OBS, GroupBy) %>%
    summarise(Value = sum(!!rlang::sym(y1), na.rm = TRUE),
              hover_text)
  
  area_gg <- ggplot(
    gdata,
    aes(
      x = OBS,
      y = Value,
      text = hover_text
      
    )
  )
  area_gg <- area_gg +
    geom_area(aes(fill = GroupBy),
              alpha = alpha)
  
  
  area_gg <- area_gg +
    labs(fill = "") +
    xlab(x_label_area) +
    ylab(y_label_area) +
    scale_x_date(
      breaks = brks,
      date_labels = x_axis_area,
      guide = guide_axis(check.overlap = overlap)
    ) +
    theme(
      axis.text.x = element_text(
        angle = 45
      )
    )
  
  area_gg
}



# UI Area plot

sidebar <- dashboardSidebar(
  collapsed = TRUE,
  skin = "light",
  sidebarMenu(
    id = "sidebar",
    menuItem(
      text = "Area Chart",
      tabName = "areaplot",
      icon = icon("chart-area")
    )
  )
)


# Define UI for application
ui <- fluidPage(
  titlePanel("Area Chart"),
  
  mainPanel(
    plotlyOutput("areaplot")
  )
)


# Define server logic
server <- function(input, output) {
  
  #Server area plot
  
  areaInput <- reactive({
    
    areagg <- AreaPlot(
      data = data,
      y1 = "AVP",
      date_brks_area = "1 month",
      topn = 10,
      x_label_area = "",
      y_label_area = "",
      x_axis_area = "%Y-%m-%d",
      overlap = FALSE,
      alpha = 1
    )
    areagg
  })
  
  
  output$areaplot <- renderPlotly({
    
    areagg <- ggplotly(areaInput(),tooltip = "text") %>%
    # areagg <- ggplotly(areaInput()) %>%
      layout(
        xaxis = list(autorange = TRUE),
        yaxis = list(autorange = TRUE)
      )
    areagg
  })
  
}

# Run the application 
shinyApp(ui = ui, server = server)

And this is the one that returns the chart, but where the hovering is not working, as it returns the info for the first data point across the whole chart:

library(shiny)
library(plotly)
library(dplyr)
library(ggplot2)

# Function for plot

AreaPlot <- function(data = data,
                     y1 = "AVP",
                     date_brks_area = "1 month",
                     topn = 10,
                     x_label_area = "",
                     y_label_area = "",
                     x_axis_area = "%Y-%m-%d",
                     overlap = FALSE,
                     alpha = 1) {
  gdata <- data
  gdata[[y1]][is.na(gdata[[y1]])] <- 0
  
  if (is.na(min(gdata$OBS))) {
    stop("")
  }
  
  brks <- seq(
    from = as.Date(min(gdata$OBS)),
    to = as.Date(max(gdata$OBS)),
    by = date_brks_area
  )
  
  group_levels <- gdata %>%
    group_by(GroupBy) %>%
    summarise(Value = sum(!!rlang::sym({{ y1 }}), na.rm = TRUE)) %>%
    ungroup() %>%
    arrange(Value) %>%
    filter(Value != 0) %>%
    top_n(topn) %>%
    select(GroupBy)
  
  gdata <- gdata %>%
    mutate(
      GroupBy = ifelse(
        GroupBy %in% t(group_levels),
        GroupBy,
        "Other"
      )
    )
  
  gdata <- gdata %>%
    group_by(OBS, GroupBy) %>%
    summarise(Value = sum(!!rlang::sym(y1), na.rm = TRUE))
  
  area_gg <- ggplot(
    gdata,
    aes(
      x = OBS,
      y = Value
    )
  )
  area_gg <- area_gg +
    geom_area(aes(fill = GroupBy),
              alpha = alpha)
  
  
  area_gg <- area_gg +
    labs(fill = "") +
    xlab(x_label_area) +
    ylab(y_label_area) +
    scale_x_date(
      breaks = brks,
      date_labels = x_axis_area,
      guide = guide_axis(check.overlap = overlap)
    ) +
    theme(
      axis.text.x = element_text(
        angle = 45
      )
    )
  
  area_gg
}



# UI Area plot

sidebar <- dashboardSidebar(
  collapsed = TRUE,
  skin = "light",
  sidebarMenu(
    id = "sidebar",
    menuItem(
      text = "Area Chart",
      tabName = "areaplot",
      icon = icon("chart-area")
    )
  )
)


# Define UI for application
ui <- fluidPage(
  titlePanel("Area Chart"),
  
  mainPanel(
    plotlyOutput("areaplot")
  )
)


# Define server logic
server <- function(input, output) {
  
  #Server area plot
  
  areaInput <- reactive({
    
    areagg <- AreaPlot(
      data = data,
      y1 = "AVP",
      date_brks_area = "1 month",
      topn = 10,
      x_label_area = "",
      y_label_area = "",
      x_axis_area = "%Y-%m-%d",
      overlap = FALSE,
      alpha = 1
    )
    areagg
  })
  
  
  output$areaplot <- renderPlotly({
    
    # areagg <- ggplotly(areaInput(),tooltip = "text") %>%
    areagg <- ggplotly(areaInput()) %>%
      layout(
        xaxis = list(autorange = TRUE),
        yaxis = list(autorange = TRUE)
      )
    areagg
  })
  
}

# Run the application 
shinyApp(ui = ui, server = server)

The only difference is the addition of "hover_text" and the tooltip in the ggplotly call.

I don't get why in the second example only the info for the first data point is shown and I also don't understand why the option of adding the tooltip with the text is not working either.

Could someone help or point in the right direction? I've already read some other StackOverflow post about similar issues but wasn't able to find a fix for my problem.

According to ggplotly documentation, it should work, so maybe it's a bug with ggplotly/Shiny?

You can find an example of the data using dput below:

structure(list(OBS = structure(c(15710, 15717, 15724, 15731, 
15738, 15745, 15752, 15759, 15766, 15773, 15780, 15787, 15794, 
15801, 15808, 15815, 15822, 15829, 15836, 15843, 15850, 15857, 
15864, 15871, 15878, 15885, 15892, 15899, 15906, 15913, 15920, 
15927, 15934, 15941, 15948, 15955, 15962, 15969, 15976, 15983, 
15990, 15997, 16004, 16011, 16018, 16025, 16032, 16039, 16046, 
16053, 16060, 16067, 16074, 16081, 16088, 16095, 16102, 16109, 
16116, 16123, 16130, 16137, 16144, 16151, 16158, 16165, 16172, 
16179, 16186, 16193, 16200, 16207, 16214, 16221, 16228, 16235, 
16242, 16249, 16256, 16263, 16270, 16277, 16284, 16291, 16298, 
16305, 16312, 16319, 16326, 16333, 16340, 16347, 16354, 16361, 
16368, 16375, 16382, 16389, 16396, 16403, 16410, 16417, 16424, 
16431, 16438, 16445, 16452, 16459, 16466, 16473, 16480, 16487, 
16494, 16501, 16508, 16515, 16522, 16529, 16536, 16543, 16550, 
16557, 16564, 16571, 16578, 16585, 16592, 16599, 16606, 16613, 
16620, 16627, 16634, 16641, 16648, 16655, 16662, 16669, 16676, 
16683, 16690, 16697, 16704, 16711, 16718, 16725, 16732, 16739, 
16746, 16753, 16760, 16767, 16774, 16781, 16788, 16795), class = "Date"), 
    GroupBy = c("all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all", "all", "all", "all", "all", 
    "all", "all", "all", "all", "all"), AVP = c(66.55, 66.74, 
    63.72, 64.62, 68.37, 76.94, 70.16, 69.78, 69.74, 67.03, 55.6, 
    53.55, 55.33, 51.6, 55.12, 65.23, 71.38, 74.18, 79.55, 79.71, 
    71.19, 70.78, 65.23, 68.82, 69.07, 69.38, 60.89, 61.99, 62.78, 
    62.72, 63.11, 67.85, 72.48, 69.93, 69.65, 72.24, 70.22, 68.76, 
    66.52, 69.94, 78.63, 69.69, 68.99, 68.6, 65.64, 70.9, 74.62, 
    70.72, 64.73, 59.34, 58.91, 58.87, 60.51, 71.99, 73.82, 64.69, 
    60.73, 61.24, 63.6, 65.91, 71.56, 68.42, 68.79, 70.57, 64.23, 
    66.58, 65.07, 64.44, 67.6, 62.95, 60.1, 70.03, 70.04, 69.39, 
    69.7, 65.12, 62.45, 63.01, 61.84, 62.91, 68.51, 70.28, 69.78, 
    73.68, 73.04, 69.78, 66.18, 65.66, 62.18, 68.57, 62.72, 62.88, 
    61.49, 66.9, 61.21, 60.41, 63.39, 63.45, 66.05, 66.18, 61.14, 
    62.54, 59.03, 59.99, 57.65, 68.87, 70.55, 64.32, 66.69, 70.28, 
    61.59, 57.63, 57.6, 58.34, 62.77, 62.74, 61.86, 67.1, 70.98, 
    69.58, 67.21, 59.9, 56.34, 64.2, 62.82, 65.23, 64.74, 61.52, 
    63.05, 73.55, 74.25, 66.11, 66.79, 60.51, 61.79, 68.52, 66.79, 
    71.85, 70.26, 70.67, 64.84, 54.63, 55.92, 57.79, 66.99, 75.4, 
    68.46, 62.35, 62.02, 60.58, 62.92, 67.75, 62.74, 61, 61.09, 
    61.13), hover_text = c("OBS:2013-01-05 Value:66.55 GroupBy:all", 
    "OBS:2013-01-12 Value:66.74 GroupBy:all", "OBS:2013-01-19 Value:63.72 GroupBy:all", 
    "OBS:2013-01-26 Value:64.62 GroupBy:all", "OBS:2013-02-02 Value:68.37 GroupBy:all", 
    "OBS:2013-02-09 Value:76.94 GroupBy:all", "OBS:2013-02-16 Value:70.16 GroupBy:all", 
    "OBS:2013-02-23 Value:69.78 GroupBy:all", "OBS:2013-03-02 Value:69.74 GroupBy:all", 
    "OBS:2013-03-09 Value:67.03 GroupBy:all", "OBS:2013-03-16 Value:55.6 GroupBy:all", 
    "OBS:2013-03-23 Value:53.55 GroupBy:all", "OBS:2013-03-30 Value:55.33 GroupBy:all", 
    "OBS:2013-04-06 Value:51.6 GroupBy:all", "OBS:2013-04-13 Value:55.12 GroupBy:all", 
    "OBS:2013-04-20 Value:65.23 GroupBy:all", "OBS:2013-04-27 Value:71.38 GroupBy:all", 
    "OBS:2013-05-04 Value:74.18 GroupBy:all", "OBS:2013-05-11 Value:79.55 GroupBy:all", 
    "OBS:2013-05-18 Value:79.71 GroupBy:all", "OBS:2013-05-25 Value:71.19 GroupBy:all", 
    "OBS:2013-06-01 Value:70.78 GroupBy:all", "OBS:2013-06-08 Value:65.23 GroupBy:all", 
    "OBS:2013-06-15 Value:68.82 GroupBy:all", "OBS:2013-06-22 Value:69.07 GroupBy:all", 
    "OBS:2013-06-29 Value:69.38 GroupBy:all", "OBS:2013-07-06 Value:60.89 GroupBy:all", 
    "OBS:2013-07-13 Value:61.99 GroupBy:all", "OBS:2013-07-20 Value:62.78 GroupBy:all", 
    "OBS:2013-07-27 Value:62.72 GroupBy:all", "OBS:2013-08-03 Value:63.11 GroupBy:all", 
    "OBS:2013-08-10 Value:67.85 GroupBy:all", "OBS:2013-08-17 Value:72.48 GroupBy:all", 
    "OBS:2013-08-24 Value:69.93 GroupBy:all", "OBS:2013-08-31 Value:69.65 GroupBy:all", 
    "OBS:2013-09-07 Value:72.24 GroupBy:all", "OBS:2013-09-14 Value:70.22 GroupBy:all", 
    "OBS:2013-09-21 Value:68.76 GroupBy:all", "OBS:2013-09-28 Value:66.52 GroupBy:all", 
    "OBS:2013-10-05 Value:69.94 GroupBy:all", "OBS:2013-10-12 Value:78.63 GroupBy:all", 
    "OBS:2013-10-19 Value:69.69 GroupBy:all", "OBS:2013-10-26 Value:68.99 GroupBy:all", 
    "OBS:2013-11-02 Value:68.6 GroupBy:all", "OBS:2013-11-09 Value:65.64 GroupBy:all", 
    "OBS:2013-11-16 Value:70.9 GroupBy:all", "OBS:2013-11-23 Value:74.62 GroupBy:all", 
    "OBS:2013-11-30 Value:70.72 GroupBy:all", "OBS:2013-12-07 Value:64.73 GroupBy:all", 
    "OBS:2013-12-14 Value:59.34 GroupBy:all", "OBS:2013-12-21 Value:58.91 GroupBy:all", 
    "OBS:2013-12-28 Value:58.87 GroupBy:all", "OBS:2014-01-04 Value:60.51 GroupBy:all", 
    "OBS:2014-01-11 Value:71.99 GroupBy:all", "OBS:2014-01-18 Value:73.82 GroupBy:all", 
    "OBS:2014-01-25 Value:64.69 GroupBy:all", "OBS:2014-02-01 Value:60.73 GroupBy:all", 
    "OBS:2014-02-08 Value:61.24 GroupBy:all", "OBS:2014-02-15 Value:63.6 GroupBy:all", 
    "OBS:2014-02-22 Value:65.91 GroupBy:all", "OBS:2014-03-01 Value:71.56 GroupBy:all", 
    "OBS:2014-03-08 Value:68.42 GroupBy:all", "OBS:2014-03-15 Value:68.79 GroupBy:all", 
    "OBS:2014-03-22 Value:70.57 GroupBy:all", "OBS:2014-03-29 Value:64.23 GroupBy:all", 
    "OBS:2014-04-05 Value:66.58 GroupBy:all", "OBS:2014-04-12 Value:65.07 GroupBy:all", 
    "OBS:2014-04-19 Value:64.44 GroupBy:all", "OBS:2014-04-26 Value:67.6 GroupBy:all", 
    "OBS:2014-05-03 Value:62.95 GroupBy:all", "OBS:2014-05-10 Value:60.1 GroupBy:all", 
    "OBS:2014-05-17 Value:70.03 GroupBy:all", "OBS:2014-05-24 Value:70.04 GroupBy:all", 
    "OBS:2014-05-31 Value:69.39 GroupBy:all", "OBS:2014-06-07 Value:69.7 GroupBy:all", 
    "OBS:2014-06-14 Value:65.12 GroupBy:all", "OBS:2014-06-21 Value:62.45 GroupBy:all", 
    "OBS:2014-06-28 Value:63.01 GroupBy:all", "OBS:2014-07-05 Value:61.84 GroupBy:all", 
    "OBS:2014-07-12 Value:62.91 GroupBy:all", "OBS:2014-07-19 Value:68.51 GroupBy:all", 
    "OBS:2014-07-26 Value:70.28 GroupBy:all", "OBS:2014-08-02 Value:69.78 GroupBy:all", 
    "OBS:2014-08-09 Value:73.68 GroupBy:all", "OBS:2014-08-16 Value:73.04 GroupBy:all", 
    "OBS:2014-08-23 Value:69.78 GroupBy:all", "OBS:2014-08-30 Value:66.18 GroupBy:all", 
    "OBS:2014-09-06 Value:65.66 GroupBy:all", "OBS:2014-09-13 Value:62.18 GroupBy:all", 
    "OBS:2014-09-20 Value:68.57 GroupBy:all", "OBS:2014-09-27 Value:62.72 GroupBy:all", 
    "OBS:2014-10-04 Value:62.88 GroupBy:all", "OBS:2014-10-11 Value:61.49 GroupBy:all", 
    "OBS:2014-10-18 Value:66.9 GroupBy:all", "OBS:2014-10-25 Value:61.21 GroupBy:all", 
    "OBS:2014-11-01 Value:60.41 GroupBy:all", "OBS:2014-11-08 Value:63.39 GroupBy:all", 
    "OBS:2014-11-15 Value:63.45 GroupBy:all", "OBS:2014-11-22 Value:66.05 GroupBy:all", 
    "OBS:2014-11-29 Value:66.18 GroupBy:all", "OBS:2014-12-06 Value:61.14 GroupBy:all", 
    "OBS:2014-12-13 Value:62.54 GroupBy:all", "OBS:2014-12-20 Value:59.03 GroupBy:all", 
    "OBS:2014-12-27 Value:59.99 GroupBy:all", "OBS:2015-01-03 Value:57.65 GroupBy:all", 
    "OBS:2015-01-10 Value:68.87 GroupBy:all", "OBS:2015-01-17 Value:70.55 GroupBy:all", 
    "OBS:2015-01-24 Value:64.32 GroupBy:all", "OBS:2015-01-31 Value:66.69 GroupBy:all", 
    "OBS:2015-02-07 Value:70.28 GroupBy:all", "OBS:2015-02-14 Value:61.59 GroupBy:all", 
    "OBS:2015-02-21 Value:57.63 GroupBy:all", "OBS:2015-02-28 Value:57.6 GroupBy:all", 
    "OBS:2015-03-07 Value:58.34 GroupBy:all", "OBS:2015-03-14 Value:62.77 GroupBy:all", 
    "OBS:2015-03-21 Value:62.74 GroupBy:all", "OBS:2015-03-28 Value:61.86 GroupBy:all", 
    "OBS:2015-04-04 Value:67.1 GroupBy:all", "OBS:2015-04-11 Value:70.98 GroupBy:all", 
    "OBS:2015-04-18 Value:69.58 GroupBy:all", "OBS:2015-04-25 Value:67.21 GroupBy:all", 
    "OBS:2015-05-02 Value:59.9 GroupBy:all", "OBS:2015-05-09 Value:56.34 GroupBy:all", 
    "OBS:2015-05-16 Value:64.2 GroupBy:all", "OBS:2015-05-23 Value:62.82 GroupBy:all", 
    "OBS:2015-05-30 Value:65.23 GroupBy:all", "OBS:2015-06-06 Value:64.74 GroupBy:all", 
    "OBS:2015-06-13 Value:61.52 GroupBy:all", "OBS:2015-06-20 Value:63.05 GroupBy:all", 
    "OBS:2015-06-27 Value:73.55 GroupBy:all", "OBS:2015-07-04 Value:74.25 GroupBy:all", 
    "OBS:2015-07-11 Value:66.11 GroupBy:all", "OBS:2015-07-18 Value:66.79 GroupBy:all", 
    "OBS:2015-07-25 Value:60.51 GroupBy:all", "OBS:2015-08-01 Value:61.79 GroupBy:all", 
    "OBS:2015-08-08 Value:68.52 GroupBy:all", "OBS:2015-08-15 Value:66.79 GroupBy:all", 
    "OBS:2015-08-22 Value:71.85 GroupBy:all", "OBS:2015-08-29 Value:70.26 GroupBy:all", 
    "OBS:2015-09-05 Value:70.67 GroupBy:all", "OBS:2015-09-12 Value:64.84 GroupBy:all", 
    "OBS:2015-09-19 Value:54.63 GroupBy:all", "OBS:2015-09-26 Value:55.92 GroupBy:all", 
    "OBS:2015-10-03 Value:57.79 GroupBy:all", "OBS:2015-10-10 Value:66.99 GroupBy:all", 
    "OBS:2015-10-17 Value:75.4 GroupBy:all", "OBS:2015-10-24 Value:68.46 GroupBy:all", 
    "OBS:2015-10-31 Value:62.35 GroupBy:all", "OBS:2015-11-07 Value:62.02 GroupBy:all", 
    "OBS:2015-11-14 Value:60.58 GroupBy:all", "OBS:2015-11-21 Value:62.92 GroupBy:all", 
    "OBS:2015-11-28 Value:67.75 GroupBy:all", "OBS:2015-12-05 Value:62.74 GroupBy:all", 
    "OBS:2015-12-12 Value:61 GroupBy:all", "OBS:2015-12-19 Value:61.09 GroupBy:all", 
    "OBS:2015-12-26 Value:61.13 GroupBy:all")), row.names = c(NA, 
-156L), class = c("tbl_df", "tbl", "data.frame"))

Solution:

The first issue is that by adding the text aes you change the grouping, i.e. to fix that explicitly map or set the group aes using group = GroupBy. The second issue is due to a change in ggplot2 which can be fixed by setting stat="identity" (see R geom_area tooltip always displays the same value).

area_gg <- area_gg +
  geom_area(aes(fill = GroupBy, group = GroupBy),
    alpha = alpha,
    stat = "identity"
  )

enter image description here

Answer

Login


Forgot Your Password?

Create Account


Lost your password? Please enter your email address. You will receive a link to create a new password.

Reset Password

Back to login