交互式R图表

3

我有一个R图表,希望用户能够在图表上点击一个点,然后我想知道他们点击的位置。就像鼠标监听器一样。我正在使用RStudio。有没有可能实现这个功能?基本上,对于他们点击的点,我想显示另一个图表,其中包含有关该点的更多详细信息。

这是我的代码:

data <- data.frame(x=c(1,2,3,4,5),y=c(1,2,3,4,5))
x11()
plot(data)

loc <- locator(n=1)
if(loc$x > 2) {
  x11()
  plot(c(1,2,3),c(5,6,7))
}

loc <- locator(n=1)
if(loc$x > 2) {
  x11()
  plot(c(4,5,6),c(5,6,7))
}

所以,第一个图表有5个数据点。如果用户超过x值为2,则我想打开另一个图表,该图表绘制您看到的列出的数据点(3个数据点)。然后,如果他们关闭该图表并再次在原始的5个数据点图表上单击超过2,则我希望它打开一个新的图表,其中包含您在第二个if语句中看到的3个数据点。

但是它给我带来了错误和I/O问题。


在运行R 2.13.1和Mac X11的Mac-GUI会话中正常工作。 - IRTFM
你说的Mac-GUI会话是什么意思? - CodeGuy
第二次点击无效。只有第一次对我有效。第二次点击什么也不会发生,即使在执行第二次点击之前关闭了出现在前面的三个数据点绘图。 - CodeGuy
我如何让X11拥有原始图表为活动图表? - CodeGuy
另一种选择:看看iplots和像iplotiset.selected()等功能,但你可能会发现仅使用iplot就足够了。 - Iterator
显示剩余2条评论
2个回答

3

我知道这不是完整的答案,但作为评论它格式化得不太好。要使特定设备成为活动设备,您需要确定其编号。执行代码后,我可以获取我的设备列表并将第一个X11设备设置为当前设备。

dev.list()
#quartz    X11 quartz    X11    X11 
#     2      3      4      5      6 
dev.set(3)
#X11 
#  3 

那么请尝试这个:
x11() ; first.ID <- dev.cur()
plot(data)

loc <- locator(n=1)
if(loc$x > 2) {
  x11() ; second.ID <- dev.cur()
  plot(c(1,2,3),c(5,6,7))
}
dev.set(first.ID)
loc <- locator(n=1)
if(loc$x > 2) {
  x11() ; third.ID <- dev.cur()
  plot(c(4,5,6),c(5,6,7))
}

在我的电脑上,你还需要点击第一个图形窗口的标题来暴露它,因为Mac Gui不会将活动设备带到前景。


更好的是(如果您希望可以将其纳入答案)。在创建设备后,使用dev.ID <- as.numeric(dev.cur())获取其ID。您可以随时使用dev.set(dev.ID)更改设备。 - nico
1
我认为真正的答案需要来自于那些在RStudio中使用R的人,因为设备交互似乎存在某种无法在我的机器上复制的故障或混淆。但如果CodeGuy发现我们的评论指引他朝着成功的方向前进,我会尽力完善我的回答。 - IRTFM
1
在RStudio中,dev.cur()函数始终返回相同的值,无论您在哪个图上使用它,只要您使用RStudio设备。然而,如果您使用X11()来创建一个新的绘图,那么dev.curdev.set等函数将正常工作。 - nico

0

如果您在内置的绘图窗格中执行locator()调用,则在RStudio中可以正常工作。我认为在RStudio中调用locator针对X11会导致问题。在绘制X11详细信息后,调用dev.set(0)以使RStudio绘图窗格再次处于活动状态。

data <- data.frame(x=c(1,2,3,4,5),y=c(1,2,3,4,5))
plot(data)

loc <- locator(n=1)
if(loc$x > 2) {
        x11()
        plot(c(1,2,3),c(5,6,7))
}

dev.set(0)

loc <- locator(n=1)
if(loc$x > 2) {
        x11()
        plot(c(4,5,6),c(5,6,7))
}

“说实话,我不确定为什么dev.set(0)有效,需要与编写RStudio图形设备的开发人员确认。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接