在函数下方绘制垂直表面
Plot vertical surface below function
我正在尝试使用 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
的文档数小时之后,我仍然不知道如何在我的情节中添加一个表面 "connects" 我的线到 x-y 平面——像这样:
(为了生成这张图片,我画了很多行作弊:for (i in seq(0, 1, by = 0.01)) { lines3d(x = myx, y = mycurve(myx), z = i) }
。)
我想我需要以某种方式向 surface3d
提供正确的值。来自 ?surface3d
:
The surface is defined by the matrix of height values in z, with rows corresponding to the values in x and columns corresponding to the values in y.
鉴于我的space曲线是"vertical",x
的每个值仅对应y
的1个值。尽管如此,我仍需要为每个 xy
对指定两个 z
值,这就是我不知道如何进行的原因。
如何绘制第二张图中所示的 space 曲线?
要使用 persp3d
函数,需要为 z 创建一个矩阵,以对应所需范围内的所有 x 和 y 值。
我修改了您的函数以同时采用 x 和 y 参数以及 return 所需的 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")
在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
,您可能需要更小的步长,但这适用于您所追求的表面。
我正在尝试使用 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
的文档数小时之后,我仍然不知道如何在我的情节中添加一个表面 "connects" 我的线到 x-y 平面——像这样:
(为了生成这张图片,我画了很多行作弊:for (i in seq(0, 1, by = 0.01)) { lines3d(x = myx, y = mycurve(myx), z = i) }
。)
我想我需要以某种方式向 surface3d
提供正确的值。来自 ?surface3d
:
The surface is defined by the matrix of height values in z, with rows corresponding to the values in x and columns corresponding to the values in y.
鉴于我的space曲线是"vertical",x
的每个值仅对应y
的1个值。尽管如此,我仍需要为每个 xy
对指定两个 z
值,这就是我不知道如何进行的原因。
如何绘制第二张图中所示的 space 曲线?
要使用 persp3d
函数,需要为 z 创建一个矩阵,以对应所需范围内的所有 x 和 y 值。
我修改了您的函数以同时采用 x 和 y 参数以及 return 所需的 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")
在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
,您可能需要更小的步长,但这适用于您所追求的表面。