You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny技术问题:如何获取绘图区多次点击的X、Y轴坐标

实现Shiny绘图区多次点击坐标记录

要记录绘图区的多次点击坐标,核心是用Shiny的reactiveValues来持久化保存点击历史,每次触发点击事件时将新坐标追加到历史记录中,最后统一展示所有记录。

以下是修改后的完整代码:

library(shiny)

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

server <- function(input, output) {
  # 创建响应式对象存储点击历史
  rv <- reactiveValues(click_history = data.frame(x = numeric(), y = numeric()))
  
  output$plot1 <- renderPlot({
    plot(mtcars$wt, mtcars$mpg)
  })
  
  # 监听点击事件,追加新坐标到历史记录
  observeEvent(input$plot_click, {
    new_click <- data.frame(
      x = round(input$plot_click$x, 1),
      y = round(input$plot_click$y, 1)
    )
    rv$click_history <- rbind(rv$click_history, new_click)
  })
  
  output$info <- renderText({
    xy_str <- function(e) {
      if(is.null(e)) return("NULL\n")
      paste0("x=", round(e$x, 1), " y=", round(e$y, 1), "\n")
    }
    
    # 拼接历史点击记录
    history_str <- if(nrow(rv$click_history) == 0) {
      "暂无点击记录\n"
    } else {
      paste0("历史点击记录:\n", 
             apply(rv$click_history, 1, function(row) paste0("x=", row[1], " y=", row[2], "\n")),
             collapse = "")
    }
    
    paste0(
      "当前点击: ", xy_str(input$plot_click),
      "hover: ", xy_str(input$plot_hover),
      history_str
    )
  })
}

shinyApp(ui, server)

关键部分说明

  • reactiveValues是Shiny中用来保存响应式状态的对象,这里用它存储点击历史的dataframe,确保每次点击后数据能被持久化并触发后续输出更新。
  • observeEvent(input$plot_click, {...})专门监听绘图区的点击事件,每次点击就将格式化后的x、y坐标追加到历史记录中。
  • 在输出文本时,判断历史记录是否为空,为空则提示无记录,否则逐行展示所有历史点击的坐标。

内容的提问来源于stack exchange,提问作者Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:25:22