闪亮的RGL Plot3D:在重绘图上保持绘图视图方向

时间:2015-04-03 15:43:59

标签: r plot shiny rgl

每当我在RGL plot3D上进行重新绘图时,都会导致绘图的视图方向重置为默认值。

有没有人知道如何保存这些设置,以便在重绘图表后重新应用它们。我试过this

# save settings
pp <- par3d(no.readonly=TRUE)

# initialize plot
plot3d(c(), c(), c(), "", "", "")

# Replot data here
# ...

# restore settings
par3d(pp)

但是,这并没有恢复情节方向。

编辑:打印出par3d()的结果显示,当绘图旋转和缩放时,值没有得到更新,所以我猜这是问题所在。如果人们已经将它与rgl一起使用,那么它可能仅适用于ShinyRGL。

2 个答案:

答案 0 :(得分:2)

问题

rgl图的问题在于,在旋转绘图时它不会更改par3d旋转矩阵(对于缩放也是如此)。此外,我找不到任何提示存储旋转/缩放状态的文档。因此,我们没有关于绘图当前状态的信息,并且保存/加载该状态是不可能的。

解决方案

我的解决方案是使用滑块手动控制绘图的旋转/缩放;当这些滑块发生变化时,我们手动更新par3d旋转矩阵。

虽然我真的不喜欢这个解决方案,因为它消除了绘图旋转/缩放的许多便利,但这是我在更新后能够保持旋转/缩放状态的唯一方法。

  1. 我定义了3个滑块,表示围绕X,Y,Z轴的旋转,以及一个表示缩放ZOOM的附加滑块。
  2. 不使用图表旋转/缩放,而是使用滑块。
  3. on Slider Change:直接在par3d
  4. 中更新轮播
  5. 更新绘图(例如新数据)时,我在原始问题中描述的保存/加载状态的方法现在可以正常工作,因为par3d包含旋转/缩放状态。

答案 1 :(得分:1)

我不知道这是否在最近的rgl版本中发生了变化,但对我来说它是有效的。我使用的是rgl版本0.95.1441。

定义一个加载数据和调用plot3d()的函数(这里使用随机数据):

library(rgl)

newRGLrandom <- function(){
  n <- 10
  x <- sort(rnorm(n))
  y <- rnorm(n)
  z <- rnorm(n) + atan2(x, y)
  plot3d(x, y, z, col = rainbow(n), size=10)
}

图表以标准方向开始:

newRGLrandom()

enter image description here

然后我在rgl窗口中手动旋转:

enter image description here

当我再次调用newRGLrandom()函数时,它会以相同的旋转显示新图:

newRGLrandom()

enter image description here

我也可以保存用户轮换:

uM <- par3d()$userMatrix

并稍后将绘图移动到存储的旋转:

par3d(userMatrix = uM)

保存整个par3d对我也有用:

pp <- par3d(no.readonly=TRUE)
par3d(pp)

我不知道为什么当你尝试它时它不起作用。也许是特定于操作系统? 我的sessionInfo()如下:

> sessionInfo()
R version 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.6 (El Capitan)

locale:
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rgl_0.95.1441

loaded via a namespace (and not attached):
[1] tools_3.2.2