我在用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
的配合却很好。
答案 0 :(得分:1)
与基本图形一样,rgl
图形有两种类型:低级(如绘图点,线条等)和高级(如plot3d
或persp3d
)。默认情况下,高级绘图会先前进到下一帧(通过调用next3d()
),而低级绘图会添加到当前帧。
misc3d::contour3d
函数使用低级命令绘制所有内容,但假定它具有对整个窗口的控制权,因此它不调用next3d()
前进到下一帧,而是调用{{1 }}会清除整个窗口。
要解决此问题,您可以自己调用clear3d()
(仅在第一个绘图之后,您不需要在第一个绘图之前使用它),然后告诉next3d()
添加到场景中。也就是说,像这样更改代码:
contour3d()