Есть ли способ отключить метку наведения, когда мы перемещаем ее по полосам ошибок на графике Plotly в R? - PullRequest
1 голос
/ 30 марта 2020

Есть ли способ отключить метку наведения, когда мы перемещаем ее по полосам ошибок? Я использую ggplotly для построения графика. Я использую функцию всплывающей подсказки для представления значений в диаграмме, когда курсор перемещается вверху графиков.

    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"
   )

Когда я перемещаю курсор над столбцами, я получаю текстовые значения, то есть хорошо. Но я хочу, чтобы это отображалось только при наведении курсора на полосы, и при перемещении над полосами ошибок не должно появляться никаких значений.

Я открыт для всех предложений.

1 Ответ

2 голосов
/ 30 марта 2020

Вы можете определить переменную text только в части geom_col:

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"
)

Редактировать: Учитывая наблюдаемые проблемы, связанные с постером, чтобы выровнять элементы в (блестящая? flex?) панель инструментов, возможно, она может помочь установить autoscale = FALSE в графическом макете, если это вариант. Возможно, для зарисовки может работать следующее:


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)
...