Подтвердить что ты не робот

Подсказка, когда вы навешиваете ggplot на блестящий

Я создаю блестящее приложение.

Я рисую диаграммы с помощью ggplot.

Когда я нажимаю точки на графике, я хочу, чтобы всплывающая подсказка показывала один из столбцов в фрейме данных (настраиваемая подсказка)

Можете ли вы предложить лучший способ продвижения вперед.

Простое приложение:

# ui.R

shinyUI(fluidPage(
 sidebarLayout(
    sidebarPanel(
        h4("TEst PLot")),
    mainPanel(
        plotOutput("plot1")
    )
)
))

# server.R

library(ggplot2)
data(mtcars)

shinyServer(
function(input, output) {
    output$plot1 <- renderPlot({
        p <- ggplot(data=mtcars,aes(x=mpg,y=disp,color=factor(cyl)))
        p <- p + geom_point()
        print(p)
    })
}
)

Когда я курсирую над точками, я хочу, чтобы он показывал mtcars $wt

4b9b3361

Ответ 1

Если я правильно понял вопрос, это может быть достигнуто с недавним обновлением блестящего пакета как для ggplot2, так и для базового пакета. Используя этот пример от Уинстона Чанга и Джо Ченга http://shiny.rstudio.com/gallery/plot-interaction-basic.html, я смог решить эту проблему. Hover теперь является входным аргументом в plotOutput(), поэтому он добавляется к ui вместе с verbatimTextOutput для отображения mtcars $wt для точки, зависающей над.

На сервере я в основном делаю вектор расстояний, который вычисляет расстояние от мыши до любой точки графика, и если это расстояние меньше 3 (работает в этом приложении), тогда оно показывает mtcars $wt для ближайшей точки к вашей мыши. Для четкого ввода $plot_hover возвращает список информации о местоположении мыши, и в этом примере извлекаются только элементы x и y из ввода $plot_hover.

library(ggplot2)
library(Cairo)   # For nicer ggplot2 output when deployed on Linux

ui <- fluidPage(
    fluidRow(
        column(width = 12,
               plotOutput("plot1", height = 350,hover = hoverOpts(id ="plot_hover"))
        )
    ),
    fluidRow(
        column(width = 5,
               verbatimTextOutput("hover_info")
        )
    )
)

server <- function(input, output) {


    output$plot1 <- renderPlot({

        ggplot(mtcars, aes(x=mpg,y=disp,color=factor(cyl))) + geom_point()

    })

    output$hover_info <- renderPrint({
        if(!is.null(input$plot_hover)){
            hover=input$plot_hover
            dist=sqrt((hover$x-mtcars$mpg)^2+(hover$y-mtcars$disp)^2)
            cat("Weight (lb/1000)\n")
            if(min(dist) < 3)
                mtcars$wt[which.min(dist)]
        }


    })
}
shinyApp(ui, server)

Надеюсь, это поможет!

Ответ 2

Вы также можете использовать немного JQuery и условный renderUI чтобы показать пользовательскую подсказку рядом с указателем.

library(shiny)
library(ggplot2)

ui <- fluidPage(

  tags$head(tags$style('
     #my_tooltip {
      position: absolute;
      width: 300px;
      z-index: 100;
     }
  ')),
  tags$script('
    $(document).ready(function(){
      // id of the plot
      $("#plot1").mousemove(function(e){ 

        // ID of uiOutput
        $("#my_tooltip").show();         
        $("#my_tooltip").css({             
          top: (e.pageY + 5) + "px",             
          left: (e.pageX + 5) + "px"         
        });     
      });     
    });
  '),

  selectInput("var_y", "Y-Axis", choices = names(mtcars), selected = "disp"),
  plotOutput("plot1", hover = hoverOpts(id = "plot_hover", delay = 0)),
  uiOutput("my_tooltip")
)

server <- function(input, output) {

  data <- reactive({
    mtcars
  })

  output$plot1 <- renderPlot({
    req(input$var_y)
    ggplot(data(), aes_string("mpg", input$var_y)) + 
      geom_point(aes(color = factor(cyl)))
  })

  output$my_tooltip <- renderUI({
    hover <- input$plot_hover 
    y <- nearPoints(data(), input$plot_hover)[ ,c("mpg", input$var_y)]
    req(nrow(y) != 0)
    verbatimTextOutput("vals")
  })

  output$vals <- renderPrint({
    hover <- input$plot_hover 
    y <- nearPoints(data(), input$plot_hover)[ , c("mpg", input$var_y)]
    # y <- nearPoints(data(), input$plot_hover)["wt"]
    req(nrow(y) != 0)
    # y is a data frame and you can freely edit content of the tooltip 
    # with "paste" function 
    y
  })
}
shinyApp(ui = ui, server = server)

Редакция:

После этого поста я искал в интернете, чтобы посмотреть, можно ли сделать это более красиво, и нашел эту замечательную настраиваемую подсказку для ggplot. Я считаю, что вряд ли это можно сделать лучше, чем это.

Ответ 3

Используя plotly, вы можете просто перевести ваш ggplot в свою интерактивную версию. Просто вызовите функцию ggplotly на свой объект ggplot:

library(plotly)

data(mtcars)

shinyApp(
ui <- shinyUI(fluidPage(
  sidebarLayout(sidebarPanel( h4("Test Plot")),
    mainPanel(plotlyOutput("plot1"))
  )
)),

server <- shinyServer(
  function(input, output) {
    output$plot1 <- renderPlotly({
      p <- ggplot(data=mtcars,aes(x=mpg,y=disp,color=factor(cyl)))
      p <- p + geom_point()

      ggplotly(p)
    })
  }
))

shinyApp(ui, server)

Для настройки того, что показано в подсказке, смотрите, например. здесь.

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

Ответ 4

Вместе с моим коллегой я выпустил пакет GGTips, который делает именно это, добавляя всплывающие подсказки на графиках. Мы создали наше собственное решение, потому что у нас возникли проблемы при воссоздании наших сложных графиков с использованием графика, который не на 100% совместим с ggplot2. Git-репо имеют ссылку на онлайн-демо.

enter image description here