带有 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
图形有两种类型:低级(例如绘制点、线等)和高级(例如 plot3d
或 persp3d
) .默认情况下,高级绘图首先进入下一帧(通过调用 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)
我在使用 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
图形有两种类型:低级(例如绘制点、线等)和高级(例如 plot3d
或 persp3d
) .默认情况下,高级绘图首先进入下一帧(通过调用 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)