【问题标题】:Interactive R graph交互式 R 图
【发布时间】:2011-12-13 10:30:00
【问题描述】:

我有一个 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 个数据点的图。如果用户点击超过 2 的 x 值,那么我想打开另一个图,它绘制您看到列出的数据点(3 个数据点)。然后,如果他们关闭该图并在原始的 5 个数据点图上再次单击 2,那么我希望它使用您在第二个 if 语句中看到的 3 个数据点打开一个新图。

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

【问题讨论】:

  • 在运行 R 2.13.1 和 Mac X11 的 Mac-GUI 会话中工作正常。
  • Mac-GUI 会话是什么意思?
  • 第二次点击不起作用。只有第一个对我有用。第二次点击什么也不做,即使我在对原始图执行第二次点击之前关闭了出现的第一个 3 数据点图
  • 我怎样才能让 x11 的原始情节成为活动情节?
  • 您可以使用dev.set、dev.close等函数打开和关闭并设置默认图形窗口。

标签: r plot rstudio


【解决方案1】:

(我意识到这不是一个完整的答案,但它不会像评论那样很好地格式化。)要使特定设备成为活动设备,您需要确定其编号。执行您的代码后,我可以获取设备列表并将第一个 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 &lt;- as.numeric(dev.cur()) 获取其ID。您可以随时使用dev.set(dev.ID)更换设备。
  • 我认为真正的答案需要来自在 RStudio 中拥有 R 的人,因为设备交互似乎以某种方式被破坏或混淆,这在我的机器上是不可复制的。但是,如果 CodeGuy 发现我们的 cmets 将他指向成功的方向,我会尝试清理我的答案。
  • 在 RStudio 中 dev.cur() 将始终返回相同的值,无论您在哪个绘图上,如果您使用 RStudio 设备。但是,如果您使用X11() 新建绘图,则dev.curdev.set 等功能正常工作。
【解决方案2】:

如果您对内置绘图窗格执行locator() 调用,这在 RStudio 中可以正常工作。我认为它是针对 X11 调用 locator 导致 RStudio 出现问题。绘制 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 图形设备的开发人员。)

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2021-10-14
    • 2019-05-20
    • 2019-10-08
    相关资源
    最近更新 更多