R интерактивный график: показывать вертикальную линию при наведении

Я искал способ нарисовать вертикальную линию вдоль оси x при наведении курсора на точки на графике с помощью R. На самом деле не имеет значения, какой это пакет, будь то plotly, ggvis, rCharts, googleVis или любой другой. другой в этом отношении, но я бы предпочел использовать один из упомянутых, если это возможно.

Вот пример того, что я хотел бы иметь.


person Jam    schedule 19.12.2015    source источник
comment
это может быть то, что вам нужно rstudio.github.io/dygraphs   -  person MLavoie    schedule 19.12.2015
comment
Да, я был там, но я не могу найти вертикальную черту, есть ли она? Использование любого из rChart, блестящего или другого также будет включать эту функцию зависания.   -  person Jam    schedule 19.12.2015
comment
а как насчет этого shiny.rstudio.com/gallery/nvd3-line- диаграмма-output.html   -  person MLavoie    schedule 19.12.2015
comment
Я посмотрю на это, спасибо   -  person Jam    schedule 19.12.2015


Ответы (3)


Частичный ответ (не могу комментировать)... Plotly имеет тип "scattergl", который рисует горизонтальную и вертикальную линию при наведении.

Данные

require(plotly)    

sdate <- as.Date("2015-01-01", format = "%Y-%m-%d")
timedf <- data.frame(Date = seq.Date(sdate, by="month", length.out=12),
                         Amount = runif(12, 0, 100))
# Plotly plot
plot_ly(timedf, x=Date, y=Amount, type="scattergl")

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

person Vance Lopez    schedule 20.12.2015

Следуйте ответу Криса, чтобы заставить его работать

library(ggplot2)
library(shiny)

ui <- fluidPage(
    fluidRow(
        column(width = 12,
               plotOutput("plot1", height = 350,hover = "plot_hover")
        )
    )
)

server <- function(input, output) {
    testPlot <- ggplot(mtcars, aes(x=mpg,y=disp,color=factor(cyl))) + 
        geom_point()

    #start up plot
    output$plot1 <- renderPlot({testPlot})

    # plot after mouse over
    observeEvent(input$plot_hover, {
        x = input$plot_hover$x
        y = input$plot_hover$y
        nearPoint <- nearPoints(mtcars, input$plot_hover, 
                                threshold = 10, maxpoints = 1)
        output$plot1 <- renderPlot({
            if (nrow(nearPoint) == 1) {
                testPlot + 
                    geom_vline(xintercept = nearPoint$mpg) +
                    geom_label(x = x + 1.5, y = y, 
                               label = paste(rownames(nearPoint), "\n", nearPoint$disp))
            } else {
                testPlot
            }
        })
    })
}

shinyApp(ui, server)

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

person GL_Li    schedule 20.12.2015

Вот частичный ответ. Я не могу заставить его работать, но, возможно, кто-то увидит что-то очевидное. Я использовал ggplot2 вместо ggvis для функции geom_vline(), которая создает вертикальную линию.

Что работает:

В событии input$plot_hover мы присваиваем координату x переменной (h), а затем используем эту переменную в качестве аргумента xintercept для функции geom_vline(), которая рисует вертикальную линию.

Проблема:

Поскольку это происходит в реактивной среде, при каждом обновлении h сбрасывается, поэтому строка исчезает примерно через секунду после первого появления.

Что я пробовал:

Я попытался присвоить h второй переменной t, чтобы сохранить ее между обновлениями. Это не сработало, поэтому я создал третью переменную prev_t и, когда не было ввода (is.null(input$plot_hover) == TRUE), оставил t как prev_t. Это тоже не работает, но у меня нет кучи времени, чтобы пробовать разные вещи.

Вот код:

library(ggplot2)
library(shiny)

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

server <- function(input, output) {
    
   #h <- reactive(input$plot_hover)

   prev_t <- vector()

    output$plot1 <- renderPlot({

        if(!is.null(input$plot_hover)){
            x <- input$plot_hover
            h <- x$x
            t <- h


        # the below isnt quite working
        # I was trying to store t between updates to make the line stay on 
        # the graph until there was a second hover event

        ################### !!! ###################
        } else if(is.null(input$plot_hover)) {
            t <- prev_t
        }

        prev_t <- t
        ################## !!! ####################

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

    })


}
shinyApp(ui, server)

Надеюсь, это, возможно, поставит вас на другой путь или немного поможет. Если кто-то увидит что-то, что может решить эту проблему, пожалуйста, дайте мне знать.

person Chris C    schedule 19.12.2015
comment
спасибо! Я поэкспериментирую с этим и вернусь, если у меня все получится! - person Jam; 19.12.2015