我正在尝试使用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)
我是否需要在代码中添加任何内容?
答案 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上。