带有 contour3d 的 mfrow3d 擦除以前的图

mfrow3d with contour3d erases previous plots

我在使用 rgl 的 mfrow3d 和 misc3d 的 contour3d 显示多个 3d 图时遇到问题。 特别是,绘制新的子图将导致删除所有先前的子图。这是一个简单的例子:

library(rgl)
library(misc3d)

# setup rgl subplots
mfrow3d(1,2)

# step into first subplot
next3d()

# Draw a ball
f <- function(x, y, z)x^2+y^2+z^2
x <- seq(-2,2,len=20)
contour3d(f,4,x,x,x)

# advance to next subplot
next3d()

# Ball with one corner removed.
contour3d(f,4,x,x,x, 
      mask = function(x,y,z) x > 0 | y > 0 | z > 0, 
      screen = list(x = 290, y = -20),
      color = "red", color2 = "white")
# the first subplot is removed

在第一次调用 contour3d 时,第一个球在左侧画得很好。但是,在第二次调用contour3d之后,右边绘制了第二个图,但是删除了第一个图。

我在这里错过了什么?我的直觉是我缺少 contour3d 的参数,因为 mfrow3d 与其他 *3d 绘图函数一起工作正常,但与 contour3d.

不兼容

与基本图形一样,rgl 图形有两种类型:低级(例如绘制点、线等)和高级(例如 plot3dpersp3d) .默认情况下,高级绘图首先进入下一帧(通过调用 next3d()),而低级绘图添加到当前帧。

misc3d::contour3d 函数使用 low-level 命令绘制所有内容,但它假定它控制了完整的 window,因此与其调用 next3d() 前进到下一帧,它调用 clear3d() 清除整个 window.

要解决此问题,您可以自己调用 next3d()(仅在第一个情节之后,您不需要在第一个情节之前),然后告诉 contour3d() 添加到场景。也就是说,像这样更改您的代码:

library(rgl)
library(misc3d)

# setup rgl subplots
mfrow3d(1,2)

# Draw a ball
f <- function(x, y, z)x^2+y^2+z^2
x <- seq(-2,2,len=20)
contour3d(f,4,x,x,x)

# advance to next subplot
next3d()

# Ball with one corner removed.
contour3d(f,4,x,x,x, 
          mask = function(x,y,z) x > 0 | y > 0 | z > 0, 
          screen = list(x = 290, y = -20),
          color = "red", color2 = "white", add = TRUE)