R交互式图:在悬停时显示垂直线

时间:2015-12-19 12:31:53

标签: r interactive rcharts ggvis googlevis

我一直在寻找一种方法来绘制沿着x轴绘制垂直线的方法,当使用R将鼠标悬停在绘图中的点上时。无论是哪个包都是真的无关紧要,无论是剧情,ggvis,rCharts, googleVis或任何其他相关内容,但如果可能,我宁愿使用其中一个提到的。

以下是我想要的例子。

3 个答案:

答案 0 :(得分:2)

部分答案(无法评论)... 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")

<强>输出 enter image description here

答案 1 :(得分:1)

跟随克里斯的回答,让它发挥作用

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)

enter image description here

答案 2 :(得分:0)

这是一个部分答案。我无法让它发挥作用,但也许有人会看到明显的东西。我已使用ggplot2代替ggvis来创建垂直线的geom_vline()函数。

什么工作:

input$plot_hover事件中,我们将x坐标分配给变量(h),然后将该变量用作xinterceptgeom_vline()的争论绘制垂直线的函数。

问题:

由于这是在被动环境中发生的,因此每次更新h都会被刷新,因此该行在首次出现后大约消失一秒。

我尝试了什么:

我尝试将h分配给第二个变量t,以便在更新之间保持不变。这没有用,所以我创建了第三个变量prev_t,当没有输入(is.null(input$plot_hover) == TRUE)时,请将t保留为prev_t。这也不是&#39工作但我没有多少时间尝试不同的事情。

以下是代码:

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)

希望这可能会让你走上不同的道路或帮助一点点。如果有人看到可以解决这个问题的东西,请告诉我。