我正在尝试使用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)
但是,即使经过数小时试图了解?persp3d
和?surface3d
的文档,我仍然不知道如何在我的绘图中添加一个将线“连接”到xy平面的曲面–像这样:
(要生成此图像,我作了很多行作弊: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
值,这就是为什么我不知道如何进行的原因。
如何绘制第二幅图所示的空间曲线?
答案 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")
生成的图像如下:
如果您希望z
依赖于x
或y
,则可能需要较小的步长,但这适用于您要加工的表面。
答案 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")