Добавьте сетку на 3D-поверхность с помощью persp3D (пакет plot3D)

Я пытаюсь добавить сетку поверх 3D-поверхности, созданной с помощью persp3D (пакет plot3D), однако я не могу найти способ сделать это, не вызывая деформации сетки.

library(plot3D)
data("volcano")

volcano — это трехмерная матрица, которую можно использовать для создания трехмерного графика, просто вызвав:

persp3D(z=volcano)

Что я собираюсь сделать, так это создать новую сетку, используя размеры 3D-матрицы, а затем добавить ее на 3D-график.

# new grid
x.seq <- seq(1, dim(volcano)[1], length = 20)
y.seq <- seq(1, dim(volcano)[2], length = 20)

# Visualize grid
plot(x=c(0,length(volcano[,1])), y=c(0,length(volcano[1,])), type='n')
abline(v=x.seq, h=y.seq)

Я приблизился к этому, заменив матрицу volcano новыми созданными последовательностями, а затем нанес новую 3D-матрицу на исходную 3D-поверхность.

# New matrix using sequences created
mtx.sub <- volcano[time.seq, freq.seq]

# Plot new matrix on top of original surface
persp3D(z=volcano)
persp3D(z=amp.sub, border="black", facets=NA, add=T, colkey=list(plot=F))

3D-график с наложенной сеткой

Несмотря на то, что результат близок к тому, что я ожидал, более пристальный взгляд покажет, что сетка на самом деле не поверх существующей поверхности, это совершенно новая поверхность, которая не соответствует исходной (что совершенно очевидно, учитывая, что это другая матрица).

Я ищу способ добавить 2D-сетку, которая будет проходить по исходной поверхности, что-то похожее на abline, но для 3D-графика.

Я просмотрел документацию по plot3D и поискал в Интернете, но ни одно из решений не применимо к persp3D().

Любые мысли о том, как обойти это?


person Pedro Rocha    schedule 02.02.2018    source источник


Ответы (1)


Вы можете добавить сетку непосредственно в вызове persp3D:

persp3D(z=volcano, border="black", lwd=0.3)

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

В ответ на ваш комментарий вы можете построить график с более низким разрешением, чтобы получить более широкие границы, однако поверхность также будет иметь более низкое разрешение (см. ниже). Было бы неплохо иметь возможность построить поверхность в полном разрешении, а затем иметь более разреженную сеть граничных линий, которая по-прежнему соответствовала бы поверхности с высоким разрешением, например, нанося граничные линии только на каждую вторую грань, но я не уверен, как это сделать без взлома persp3D (или одной из функций, вызываемых persp3D).

persp3D(z=volcano[seq(1,nrow(volcano),2), seq(1,ncol(volcano),2)], 
        border="black", lwd=0.4)

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

person eipi10    schedule 02.02.2018
comment
Да, но это сетка из исходной матрицы. Я ищу способ построить сетку с подмножествами с большими ячейками - person Pedro Rocha; 02.02.2018