在功能下方绘制垂直表面

时间:2019-02-07 14:21:42

标签: r 3d rgl

我正在尝试使用rgl包创建一个非常简单的3D图:我有一个函数可以将x值映射为y值。对于给定的z(在我的示例中为z = 1),我可以在3D图中绘制此函数:

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的每个值仅对应于y的1个值。尽管如此,我仍需要为每个z对指定两个xy值,这就是为什么我不知道如何进行的原因。

如何绘制第二幅图所示的空间曲线?

2 个答案:

答案 0 :(得分:2)

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依赖于xy,则可能需要较小的步长,但这适用于您要加工的表面。

答案 1 :(得分:1)

要使用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