以交互方式在情节中移动十字准线的好策略是什么?

时间:2013-10-18 19:51:33

标签: r plot d3.js interactive shiny

我正处于规划功能的早期阶段,该功能需要在绘图中以交互方式移动十字准线。以下是一些基本的图形调用,它们将以非常笨重的方式执行此操作:

set.seed(9)
df <- data.frame(x = rnorm(10), y = rnorm(10))
plot(df)

abline(v = 0.5, h = 1.2, col = "red") # 'original' crosshairs
loc <- locator() # click location in plot, then ESC
abline(v = 0.5, h = 1.2, col = "transparent") # clear 'original' crosshairs
abline(h = loc$x[1], v = loc$y[2], col = "green") # crosshairs at new position

我需要的是能够以精确的方式控制十字准线位置,并返回它们的位置。单击上面的示例并没有真正给出足够精细的控制。我希望能够使用键盘上的左右上下箭头来逛逛。但我不认为R'以这种方式(即在图形窗口中时)监听l-r-u-d键。如果我错了,请纠正我。另一种我能想象到的方法是十字光跟随光标直到一次点击或类似的东西。

所以我正在寻找一个策略来实现这一点,使用R中的数据。图形pkg无关紧要(base,ggplot2,lattice),数据和交互功能可能是其他语言,可能会显示如果需要,在网页中。我正在考虑使用像d3shiny这样的交互式图形的新方法之一。我已经看了一下这些,但确实需要经常做这类事情的人指出我正确的方向。

我还需要能够缩放和注释,但我可以在最终选择的任何框架内解决这些问题。但我提到这一点,所以提供答案的人知道除了我特别提到的那个之外还有其他任务。因此,也许一种特殊方法会将某人称为“前进之路”。最后,真实数据集会很大,所以速度是一个问题。

2 个答案:

答案 0 :(得分:2)

请改为尝试:

set.seed(9)
df <- data.frame(x = rnorm(10), y = rnorm(10))
plot(df)

abline(v = 0.5, h = 1.2, col = "red") # 'original' crosshairs
while (T) {
  loc <- locator(1) # click location in plot, then ESC
  plot(df) # clear 'original' crosshairs
  abline(h = loc$y, v = loc$x, col = "green") # crosshairs at new position
}

如果你需要更多的力量,Shiny是一个很好的选择(在我的偏见中),除非你已经熟练掌握HTML,JavaScript和SVG,否则d3可能有点过分。

答案 1 :(得分:1)

在TeachingDemos包中有一些不同的功能,它们在图形窗口中使用鼠标进行交互式定位。 TkIdentify函数使用Tk窗口并显示实时拖动,dynIdentify函数的工作方式类似,但不需要Tk(它使用getGraphicsEvent,所以你需要一个支持它的系统,我知道Windows会这样做)。 HWidentifyHTKidentify功能也遵循鼠标。

数独包中的playSudoku函数还会读取图形中的当前鼠标指针位置,并从键盘读取按键(同时具有Tk窗口或getGrahpicsEvent选项)。

这些也可以适用于使用RStudio的操作包(我在TeachingDemos的那条线上有计划)。我不知道还有足够的光泽,知道在闪亮的环境中做这件事是多么容易。

我建议查看上面提到的功能,看看功能是否与您想要的功能相似,如果是,请查看代码,看看如何使其适应需求。