交互式闪亮应用返回错误的坐标

时间:2017-08-18 16:36:21

标签: r ggplot2 shiny

我正在尝试使用Shiny创建一个交互式散点图,我可以点击图形上的任何点并获得相应的x和y坐标。它的工作原理(即RStudio示例)基本图形(注释掉)使用ggplot给出不同的和不正确的数字。

library(shiny)
library(ggplot2)

ui <- basicPage(
  plotOutput("plot1", click = "plot_click"),
  verbatimTextOutput("info")
)

server <- function(input, output) {
  output$plot1 <- renderPlot({
    # plot(mtcars$wt, mtcars$mpg)
    g=ggplot(mtcars,aes(wt,mpg))+geom_point()
    g

  })

  output$info <- renderText({
    paste0("x=", input$plot_click$x, "\ny=", input$plot_click$y)
  })
}

shinyApp(ui, server)

我是否需要在代码中添加任何内容?

2 个答案:

答案 0 :(得分:1)

一种可能的方法是使用print()将ggplot2对象打印到屏幕上,然后它会返回[0,1]中的坐标。如果您之前记下了绘图限制,则可以计算所需的值。

library(shiny)
library(ggplot2)

ui <- basicPage(
  plotOutput("plot1", click = "plot_click"),
  verbatimTextOutput("info")
)

server <- function(input, output) {
  output$plot1 <- renderPlot({
    # plot(mtcars$wt, mtcars$mpg)
    g=ggplot(mtcars,aes(wt,mpg))+geom_point()


    # works from version 0.8.9 on: https://stackoverflow.com/questions/7705345/how-can-i-extract-plot-axes-ranges-for-a-ggplot2-object
    a=ggplot_build(g)$layout$panel_ranges[[1]]
    x.range <<- a$x.range
    y.range <<- a$y.range

    print(g)

  })

  output$info <- renderText({

    paste0("x=", x.range[1]+diff(x.range)*input$plot_click$x,
           "\ny=", y.range[1]+diff(y.range)*input$plot_click$y)
  })
}

shinyApp(ui, server)

这有效,但显然有很多可能出错的事情。不确定这是否是最佳方式。

答案 1 :(得分:0)

非常感谢Marco的评论,这确实是一个版本号问题。更新到最新的Shiny版本解决了这个问题。现在'正确'的版本可以工作,而我的黑客,就像马可一样。我现在在Shiny 1.0.4和ggplot2 2.2.0上。