gpt4 book ai didi

r - 提取交互式图中鼠标单击的确切坐标

转载 作者:行者123 更新时间:2023-12-04 08:54:11 25 4
gpt4 key购买 nike

简而言之:我正在寻找一种方法来获取由ggplot2ggplotly呈现的交互式x/y散点图中的一系列鼠标位置(单击时)的精确坐标。

我知道plotly(以及R的其他几个交互式绘图软件包)可以与Shiny结合使用,其中box-或lazzo select可以返回所选子空间内所有数据点的列表。但是,在我正在分析的大多数数据集中,此列表将是巨大的,而且我需要能够以R Markdown 格式可重复地进行分析(编写一些,大多数少于5-6,点坐标要多得多)可读)。此外,我必须知道单击的确切位置,以便能够提取不同数据集中的点的同一多边形内的点,因此在一个数据集中选择中的点列表是没有用的。

Grid包中的grid.locator()函数几乎可以完成我要寻找的功能(包裹在fx gglocator中的函数),但是我希望有一种方法可以在plotly渲染的交互式绘图中(或也许我不做的其他事情)进行相同的操作(不知道吗?),因为数据集通常非常庞大(请参见下图),因此在多次分析迭代过程中,能够交互式放大和缩小非常令人赞赏。

enter image description here

通常,我必须多次缩放轴以模拟放大和缩小,这在进行很多次时会很累。正如您在上面的图中所看到的,图中有很多信息可供探索(该图在内存中大约有300MB)。

下面是一个小reprex,它显示了我目前如何在静态绘图上使用grid.locator来执行此操作:

library(ggplot2)
library(grid)

p <- ggplot(mtcars, aes(wt, mpg)) +
geom_point()

locator <- function(p) {
# Build ggplot object
ggobj <- ggplot_build(p)

# Extract coordinates
xr <- ggobj$layout$panel_ranges[[1]]$x.range
yr <- ggobj$layout$panel_ranges[[1]]$y.range

# Variable for selected points
selection <- data.frame(x = as.numeric(), y = as.numeric())
colnames(selection) <- c(ggobj$plot$mapping$x, ggobj$plot$mapping$y)

# Detect and move to plot area viewport
suppressWarnings(print(ggobj$plot))
panels <- unlist(current.vpTree()) %>%
grep("panel", ., fixed = TRUE, value = TRUE)
p_n <- length(panels)
seekViewport(panels, recording=TRUE)
pushViewport(viewport(width=1, height=1))

# Select point, plot, store and repeat
for (i in 1:10){
tmp <- grid.locator('native')
if (is.null(tmp)) break
grid.points(tmp$x,tmp$y, pch = 16, gp=gpar(cex=0.5, col="darkred"))
selection[i, ] <- as.numeric(tmp)
}
grid.polygon(x= unit(selection[,1], "native"), y= unit(selection[,2], "native"), gp=gpar(fill=NA))
#return a data frame with the coordinates of the selection
return(selection)
}

locator(p)

然后从此处使用 point.in.polygon函数根据选择对数据进行子集化。

可能的解决方案是在绘图中添加不可见点(例如100x100),然后在Shiny应用程序中使用 plotly_clickevent_data()功能,但这一点都不理想。

预先感谢您的想法或解决方案,我希望我的问题足够清楚。

-卡巴斯

最佳答案

我用了ggplot2。除了https://shiny.rstudio.com/articles/plot-interaction.html上的 Material 外,我还要提及以下内容:

首先,在创建绘图时,请勿在“renderPlot()”内使用“print()”,否则坐标将是错误的。例如,如果用户界面中包含以下内容:

plotOutput("myplot", click = "myclick")

服务器中的以下内容将起作用:
output$myplot <- renderPlot({
p = ggplot(data = mtcars, aes(x=mpg, y=hp)) + geom_point()
p
})

但是,如果您执行以下操作,则点击坐标将是错误的:
output$myplot <- renderPlot({
p = ggplot(data = mtcars, aes(x=mpg, y=hp)) + geom_point()
print(p)
})

然后,您可以通过添加到服务器来存储坐标:
mydata = reactiveValues(x_values = c(), y_values = c())

observeEvent(input$myclick, {

mydata$x_values = c(mydata$x_values, input$myclick$x)
mydata$y_values = c(mydata$y_values, input$myclick$y)

})

除了X-Y坐标外,将facep与ggplot2配合使用时,还可以通过以下方式引用单击的facet面板:
input$myclick$panelvar1

关于r - 提取交互式图中鼠标单击的确切坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48526640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com