Как построить поверхность в rgl plot3d - PullRequest
0 голосов
/ 20 ноября 2018

Итак, у меня есть этот код, который дает точную поверхность

f = function(x, y){
    z = ((x^2)+(3*y^2))*exp(-(x^2)-(y^2))
}
plot3d(f, col = colorRampPalette(c("blue", "white")), 
       xlab = "X", ylab = "Y", zlab = "Z", 
       xlim = c(-3, 3), ylim = c(-3, 3),
       aspect = c(1, 1, 0.5))

, дающую следующий график: 3d exact plot Теперь у меня есть некоторый код, который выполняет алгоритм метрополии случайного блуждания, чтобы воспроизвести вышеупомянутое изображение.Я думаю, что это работает, как будто я делаю еще один график из этих рассчитанных значений, я получаю следующее изображение с 500 точками.Вот код

open3d()
plot3d(x0, y0, f(x0, y0), type = "p")

, который дает следующий график: enter image description here Я знаю, что трудно смотреть на это неподвижное изображение, но возможность поворота выборки работает.

Теперь вотмой вопрос: как я могу использовать plot3d(), чтобы у меня была поверхность, соединяющая все эти точки и дающая более неровное представление точного графика?Или как я могу иметь каждую точку на оси z в виде стержня от плоскости xy?Я просто хочу что-то более трехмерное, чем точки, и я не могу найти, как это сделать.

Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Вот график с только 50 точками, используя мой оригинальный код.

Scatter graph of 50 points

Когда я тогда применяю то, что было сказано Стефаном Лораном, я получаюэтот график, который кажется слишком точным, когда мне даны действительные точки

wire plot

Возможно, вам нужно объяснить мне, что на самом деле происходит в функции parametric3d

0 голосов
/ 26 ноября 2018

Вы можете сделать это путем триангуляции поверхности.Вы не предоставляете нам свои фактические данные, но я могу создать некоторые аналогичные данные, используя

f = function(x, y){
    z = ((x^2)+(3*y^2))*exp(-(x^2)-(y^2))
}
x <- runif(500, -3, 3)
y <- runif(500, -3, 3)
z <- f(x, y)

Затем построение графиков выполняется с использованием метода ?persp3d.deldir:

library(deldir)
library(rgl)
col <- colorRampPalette(c("blue", "white"))(20)[1 + round(19*(z - min(z))/diff(range(z)))]
dxyz <- deldir::deldir(x, y, z = z, suppressMsge = TRUE)
persp3d(dxyz, col = col, front = "lines", back = "lines")

Этоможет потребоваться косметические исправления, например

aspect3d(2, 2, 1)

После некоторого поворота это дает мне следующий график:

enter image description here

0 голосов
/ 21 ноября 2018

Я не уверен, что понимаю, что вы хотите.Если мое понимание верно, вот решение.Определите параметрическое представление вашей поверхности:

fx <- function(u,v) u
fy <- function(u,v) v
fz <- function(u,v){
  ((u^2)+(3*v^2))*exp(-(u^2)-(v^2))
}

Допустим, у вас есть эти точки:

x0 <- seq(-3, 3, length.out = 20)
y0 <- seq(-3, 3, length.out = 20)

Затем вы можете использовать функцию parametric3d пакета misc3d, сопция fill=FALSE, чтобы получить каркас:

library(misc3d)
parametric3d(fx, fy, fz, u=x0, v=y0, 
             color="blue", fill = FALSE)

enter image description here

Это то, что вы хотите?

Чтобы получить некоторые вертикальныебары, используйте функцию segments3d из rgl:

i <- 8
bar <- rbind(c(x0[i],y0[i],0),c(x0[i],y0[i],f(x0[i],y0[i])))
segments3d(bar, color="red")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...