#r #rgl
#r #rgl
Вопрос:
У меня возникли проблемы с отображением нескольких 3D-графиков с помощью rgl mfrow3d
и misc3d contour3d
. В частности, построение нового подзаголовка приведет к удалению всех предыдущих подзаголовков. Вот простой пример:
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
.
Ответ №1:
Как и базовая графика, rgl
графика бывает двух типов: низкоуровневая (например, точки рисования, линии и т.д.) и высокоуровневая (например, plot3d
или persp3d
). По умолчанию графики высокого уровня сначала переходят к следующему кадру (путем вызова next3d()
), в то время как графики низкого уровня добавляются к текущему.
misc3d::contour3d
Функция рисует все, используя команды низкого уровня, но предполагает, что она контролирует все окно, поэтому вместо вызова next3d()
для перехода к следующему кадру, она вызывает clear3d()
, который очищает все окно.
Чтобы обойти это, вы можете вызвать 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)