mfrow3d с contour3d удаляет предыдущие графики

#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)