График вертикальной поверхности под функцией - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать очень простой трехмерный график, используя пакет rgl: у меня есть функция, которая просто отображает значения x в значения y.Для данного z (в моем примере: z = 1) я могу построить эту функцию на трехмерном графике:

library(rgl)

mycurve <- function(x) { return (1/x)}
myx <- seq(1, 10, by = 0.1)

plot3d(x = NA, xlim = c(0, 10), ylim = c(0, 10), zlim = c(0, 5), 
       xlab = "x", ylab = "y", zlab = "height")
lines3d(x = myx, y = mycurve(myx), z = 1)

2D line in 3D plot

Тем не менее, даже после нескольких часов попыток понять документацию ?persp3d и ?surface3d, я все еще не знаю, как добавить поверхность к моему графику, которая «соединяет» мою линию с плоскостью xy - вот так:

Space curve.

(Чтобы создать это изображение, я обманул, построив много линий: for (i in seq(0, 1, by = 0.01)) { lines3d(x = myx, y = mycurve(myx), z = i) }.)

Я полагаю, что мне нужно предоставитьисправить значения до surface3d как-то.С ?surface3d:

Поверхность определяется матрицей значений высоты в z, со строками, соответствующими значениям в x, и столбцами, соответствующими значениям в y.

Учитывая, что моя пространственная кривая "вертикальная", каждое значение x соответствует только 1 значению y.Тем не менее, мне нужно указать два z значения для каждой пары xy, поэтому я не знаю, как действовать дальше.

Как построить кривую пространства, как показано на втором изображении?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

В persp3d все 3 аргумента могут быть матрицами, поэтому вы можете строить произвольные поверхности.Для ваших нужд это работает:

mycurve <- function(x) { return (1/x)}
myx <- seq(1, 10, by = 0.1)


xmat <- matrix(NA, 2, length(myx))
ymat <- matrix(NA, 2, length(myx))
zmat <- matrix(NA, 2, length(myx))
for (i in 0:1) { 
  xmat[i+1,] <- myx
  ymat[i+1,] <- mycurve(myx)
  zmat[i+1,] <- i
}
library(rgl)
persp3d(x = xmat, y = ymat, z = zmat, xlim = c(0, 10), ylim = c(0, 10), zlim = c(0, 5), 
       xlab = "x", ylab = "y", zlab = "height", col = "gray")

Полученное изображение выглядит следующим образом:

enter image description here

Если вы хотите zЧтобы зависеть от x или y, вам, вероятно, понадобится меньший размер шага, но это работает для поверхности, которую вы ищете.

0 голосов
/ 07 февраля 2019

Чтобы использовать функцию persp3d, необходимо создать матрицу для z, которая будет соответствовать всем значениям x и y в требуемом диапазоне.
Я пересмотрел вашу функцию, приняв параметры x и y и вернув еежелаемое значение Z.Внешняя функция будет вызывать функцию несколько раз, чтобы заполнить матрицу.Затем построите график с заданными осями x и y и z (из внешней функции)

library(rgl)

mycurve <- function(x, y) { return (1/x)}
myx <- seq(1, 10, by = 0.4)
myy <-seq(1, 10, by =0.4)
#create matrix
data<-outer(myx, myy, mycurve)
#plot points
persp3d(x=myx, y=myy, z=data, 
        xlab = "x", ylab = "y", zlab = "height")

enter image description here

...