Измените текст при наведении курсора в ggplotly geom_bar в соответствии с количеством

#r #shiny #geom-bar #ggplotly

Вопрос:

Поэтому я создаю веб-приложение, используя R Shiny. Я хочу показать гистограмму с ggplotly, вот результат. Я хочу изменить ховертекст на категорию: … Подсчет: ..
Я пытался, как в приведенном ниже коде, но я не знаю, как назвать значение подсчета. Я пытался вызвать счетчик, частоту. Но это не работает. Есть идеи, как это исправить?

   output$plotb <- renderPlotly({
    ggplotly(ggplot(data=dataset(),aes(x=dataset()[[input$bo]],
                                       text=paste("Category: ", dataset()[[input$bo]],
                                                  "<br>Count: "))) 
               geom_bar(fill='cornflowerblue',color="black") 
               labs(title=sprintf("Bar chart of %s",input$bo),
                    x=input$bo,y="Frequency") 
               theme_light(),tooltip="text")
  })
 

Ответ №1:

Одним из вариантов достижения желаемого результата может быть использование ggplot2::after_stat , которое позволяет вам получить доступ к значениям, вычисляемым с помощью статистики, например, в случае geom_bar , если уровень статистики по умолчанию stat="count" равен . К сожалению, для этого требуется дополнительная работа по получению меток категорий. С этой целью я добавил в свой пример код, который преобразует входную переменную в фактор и возвращает уровни фактора. categories() Это позволяет добавлять метки категорий внутри after_stat с помощью categories()[x] :

Поскольку вы не предоставили никаких данных, я использовал ggplot2::mpg их в качестве примера:

 library(shiny)
library(plotly) 

ui <- fluidPage(
  plotlyOutput("plotb")
)

server <- function(input, output, session) {
  
  input <- list(bo = "class")
  
  dataset <- reactive({ mpg })
  
  categories <- reactive({ levels(factor(dataset()[[input$bo]])) })
  
  output$plotb <- renderPlotly({
    ggplot(data = dataset(), aes(
      x = .data[[input$bo]],
      text = after_stat(paste(
        "Category: ", categories()[x],
        "<br>Count: ", count
      ))
    ))  
      geom_bar(fill = "cornflowerblue", color = "black")  
      labs(
        title = sprintf("Bar chart of %s", input$bo),
        x = input$bo, y = "Frequency"
      )  
      theme_light()
    
    ggplotly(tooltip = "text")
  })
}

shinyApp(ui, server)
 

введите описание изображения здесь