Search code examples
rplotlyshinydashboardggplotlyerrorbar

Is there any way to disable the hover label when we move it over the error bars in Plotly graph in R?


Is there any way to disable the hover label when we move it over the error bars ? I am using ggplotly to plot a graph. I am using the tooltip function to represent the values in the barchart when the cursor is moved on the top of the graphs.

    Source_Data <-
    data.frame(
    key = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
    Product_Name = c(
      "Table",
      "Table",
      "Chair",
      "Table",
      "Bed",
      "Bed",
      "Sofa",
      "Chair",
      "Sofa"
    ),
    Product_desc = c("XX", "XXXX", "YY", "X", "Z", "ZZZ", "A", "Y", "A"),
    sd = c(0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.7, 0.8, 0.5),
    Cost = c(1, 2, 3, 4, 2, 3, 4, 5, 6)

   )

ggplotly((
   Source_Data %>%
    ggplot(
      aes(
        Product_Name,
        Cost,
        ymin = Cost - sd,
        ymax = Cost + sd,
        fill = Product_desc,
        text = paste("Product Name:", Product_Name, "<br>", "Cost:", Cost)
      )
    ) +
    geom_col(position = position_dodge2(width = .9, preserve = "single")) +
    geom_errorbar(position = position_dodge2(
      width = .9,
      preserve = "single",
      padding = .5
    )) +
    geom_text(
      aes(y = Cost + sd, label = Cost),
      position = position_dodge2(width = .9),
      vjust = -1
    ) +
    facet_wrap( ~ key, scales = "free_x", strip.position = "bottom") +
    theme(strip.placement = "outside") +
    theme_bw()
    ),
   tooltip = "text"
   )

When i move the cursor over the bars I am getting the text values, thats fine. But I want this to be displayed only when i move the cursor over the Bars and No values should pop up when I move over the error bars.

I am open for all Suggestions.


Solution

  • You could define the text variable only in the geom_col part:

    library(ggplot2)
    library(plotly)
    library(dplyr)
    Source_Data <-
        data.frame(
            key = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
            Product_Name = c(
                "Table",
                "Table",
                "Chair",
                "Table",
                "Bed",
                "Bed",
                "Sofa",
                "Chair",
                "Sofa"
            ),
            Product_desc = c("XX", "XXXX", "YY", "X", "Z", "ZZZ", "A", "Y", "A"),
            sd = c(0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.7, 0.8, 0.5),
            Cost = c(1, 2, 3, 4, 2, 3, 4, 5, 6)
    
        )
    
    ggplotly((
        Source_Data %>%
            ggplot(
                aes(
                    Product_Name,
                    Cost,
                    ymin = Cost - sd,
                    ymax = Cost + sd,
                    fill = Product_desc
                    # ,
                    # text = paste("Product Name:", Product_Name, "<br>", "Cost:", Cost)
                )
            ) +
    
            geom_errorbar(position = position_dodge2(
                width = .9,
                preserve = "single",
                padding = .5
            )) +
    
            # geom_text(aes(y = Cost + sd, label = Cost),
            #     position = position_dodge2(width = .9),
            #     vjust = -1
            # ) +
            geom_col(position = position_dodge2(width = .9, preserve = "single"), 
                     aes(text = paste("Product Name:", Product_Name, "<br>", "Cost:", Cost))) +
            facet_wrap( ~ key, scales = "free_x", strip.position = "bottom") +
            theme(strip.placement = "outside") +
            theme_bw()
    ),
    tooltip = "text"
    )
    

    Edit: Given the observed problems of the poster to keep the elements lined up in a (shiny? flex?) dashboard, perhaps it might help to set autoscale = FALSE in the plotly layout, if that is an option. Perhaps the following could work for the plotting part:

    
    p1 <- ggplot(data = Source_Data, aes(Product_Name, Cost, ymin = Cost - sd,
            ymax = Cost + sd, fill = Product_desc)) +
        geom_col(position = position_dodge2(width = .9, preserve = "single"), 
                 aes(text = paste("Product Name:", Product_Name, "<br>", "Cost:", Cost))) +
        geom_errorbar(position = position_dodge2(width = .9, preserve = "single", 
                                                 padding = .9)) +
        facet_wrap( ~ key, scales = "free_x", strip.position = "bottom") +
        theme(strip.placement = "outside") +
        theme_bw() 
    
    ggplotly(p1, tooltip = "text") %>% plotly::layout(autosize=FALSE)