带有轮廓3d的mfrow3d会擦除以前的绘图

时间:2020-08-29 14:00:38

标签: r rgl

我在用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之后,在右边绘制了第二个图,但是删除了第一个图。

enter image description here

我在这里想念什么?我的直觉是我错过了contour3d的参数,因为mfrow3d与其他*3d的绘图功能配合正常,而与contour3d的配合却很好。

1 个答案:

答案 0 :(得分:1)

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

misc3d::contour3d函数使用低级命令绘制所有内容,但假定它具有对整个窗口的控制权,因此它不调用next3d()前进到下一帧,而是调用{{1 }}会清除整个窗口。

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

contour3d()