如何在Shiny绘图上显示点击标记?绘图重置问题求助
解决Shiny绘图点击标记后立即重置的问题
我明白你遇到的痛点了——点击绘图添加标记后,标记马上就消失了对吧?这是因为每次点击触发绘图重新渲染时,之前的点击位置没有被保存下来,导致新的绘图完全覆盖了旧的。咱们用reactiveValues来持久化存储点击坐标就能解决这个问题,下面是修复后的完整可运行代码:
library(shiny) ui <- fluidPage( shinyjs::useShinyjs(), column(12, plotOutput("Locations", width=500, height=500, click="plot_click") ) ) server <- function(input, output, session) { # 初始化reactiveValues来存储所有点击的坐标 rv <- reactiveValues(clicks = data.frame(x = numeric(), y = numeric())) # 监听绘图点击事件,把新的坐标添加到存储里 observeEvent(input$plot_click, { new_click <- data.frame(x = input$plot_click$x, y = input$plot_click$y) rv$clicks <- rbind(rv$clicks, new_click) }) output$Locations <- renderPlot({ # 先绘制基础图(这里用随机散点图做示例,你可以换成自己的图) plot(rnorm(50), rnorm(50), main = "点击添加标记", xlab = "X轴", ylab = "Y轴") # 如果有点击记录,就把所有标记画出来 if(nrow(rv$clicks) > 0) { points(rv$clicks$x, rv$clicks$y, col = "red", pch = 19, cex = 1.5) # 也可以添加文本提示,比如显示坐标 text(rv$clicks$x, rv$clicks$y, labels = paste0("(", round(rv$clicks$x,2), ",", round(rv$clicks$y,2), ")"), pos = 3, col = "blue") } }) } shinyApp(ui, server)
关键知识点解释:
reactiveValues的作用:它是Shiny里用来存储可变状态的容器,点击坐标会被持久化保存,不会因为绘图重新渲染而丢失。observeEvent监听点击:每次用户点击绘图区域,就把当前点击的x、y坐标追加到rv$clicks数据框里。- 绘图时包含所有标记:在
renderPlot里,先画你的基础图形,然后遍历rv$clicks里的所有坐标,用points()绘制红色圆点标记,还可以用text()显示具体坐标值。
这样修改后,每次点击都会保留之前的所有标记,不会再出现重置的问题啦~
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

