R: построить плоскость в 3D

Я пытаюсь добавить плоскость z=0 к 3D-графику. Я использую код

library(plot3D)
zero = matrix(0, 20, 20)
persp3D(x=seq(1,20), y=seq(1,20), z = Delta_B, theta = 20, xlab = "D", ylab = "IR", zlab = "B increment")
persp3D(x=seq(1,20), y=seq(1,20), z = zero, col = "black", add = T)

Но плоскость z=0 не появляется.введите здесь описание изображения

Если я буду трясти самолет с

zero = jitter(matrix(0, 20, 20))

Тогда я могу видеть это правильно.

введите здесь описание изображения

На самом деле попытка построить только плоскость приводит к пустому графику.

persp3D(x=seq(1,20), y=seq(1,20), z = zero, col = "black")

введите здесь описание изображения

ИЗМЕНИТЬ

Частичным решением было бы использование

zero = jitter(matrix(0, 20, 20)) / 10000

в результате получается плоскость, неотличимая от намеченной.

введите здесь описание изображения


person Manfredo    schedule 06.10.2019    source источник
comment
Из какого пакета происходит persp3D? В rgl есть persp3d, но нет persp3D в этом или базовом R. Также ваши примеры не воспроизводимы.   -  person Spacedman    schedule 06.10.2019
comment
Пакет plot3D. Поверхность Delta_B не воспроизводима, но второй пример, где я рисую только плоскость, воспроизводим. Я думаю, как только это будет решено, добавление его к существующему сюжету должно быть тривиальным.   -  person Manfredo    schedule 06.10.2019


Ответы (1)


Что-то терпит неудачу всякий раз, когда persp3D представлен постоянной матрицей. Обычно это происходит потому, что программа пытается вычислить масштаб диапазона Z и делит на ноль. Я ожидал увидеть это только при построении постоянной плоскости, а не при ее добавлении.

Например, base::persp выдаст ошибку:

> persp(zero)
Error in persp.default(zero) : invalid 'z' limits

Если вам нужен полностью воспроизводимый пример, создайте Delta_B таким образом:

> Delta_B = matrix(apply(expand.grid(1:20,1:20),1,function(r){sum(r)-20}),20,20)

Затем:

> persp3D(x=seq(1,20), y=seq(1,20), z = Delta_B, theta = 20, xlab = "D", ylab = "IR", zlab = "B increment")
> zero = matrix(0, 20, 20)
> persp3D(x=seq(1,20), y=seq(1,20), z = zero, col = "black", add = TRUE)

Не показывает плоскость zero. Но все, что делает матрицу zero непостоянной, исправит это:

> zero[1,1]=0.000001
> persp3D(x=seq(1,20), y=seq(1,20), z = zero, col = "black", add = TRUE)

Этого должно быть достаточно, чтобы отправить отчет об ошибке сопровождающему. Код для persp3D — длинный кусок кода, в который я сейчас не вникаю.

person Spacedman    schedule 06.10.2019