【问题标题】:Overlay surface to 3d points将曲面叠加到 3d 点
【发布时间】:2013-09-14 19:01:56
【问题描述】:

假设我有一个 3D 点云表示为:

arv = data.frame(axis_x = rnorm(n=300, mean=-0.20, sd=1.01),
             axis_y = rnorm(n=300, mean=-0.45, sd=0.97),
             elevation = rnorm(n=300, mean=-813.2, sd=13.89))

我还有一个抛物面模型:

model = lm(formula = elevation ~ (axis_x + axis_y)^2 + I(axis_x^2) + I(axis_y^2), data = arv)

有没有办法在 3D 图中将两者(点和模型)一起绘制?

【问题讨论】:

  • 我不确定是否要否决重复投票或发布扩展使用pkg:rgl 和函数car:scatter3d 的值的答案:请参阅stackoverflow.com/questions/8044589/…
  • @DWin 我的问题显然与您链接的问题不同。从技术上讲,我无法仅查看您的链接来解决我的问题。因此,它不是重复的。

标签: r 3d


【解决方案1】:

这可以通过persp()trans3d 完成。为了提高清晰度,它有助于用线将观察值连接到函数的 3d 表面:

# data
arv = data.frame(axis_x = rnorm(n=300, mean=-0.20, sd=1.01),
             axis_y = rnorm(n=300, mean=-0.45, sd=0.97),
             elevation = rnorm(n=300, mean=-813.2, sd=13.89))
# fit             
model = lm(formula = elevation ~ (axis_x + axis_y)^2 + I(axis_x^2) + I(axis_y^2), data = arv)

# grid for plotting function
x <- seq(min(arv$axis_x), max(arv$axis_x), length.out = 20)
y <- seq(min(arv$axis_y), max(arv$axis_y), length.out = 20)

# function for predicted surface from model
f <- function(x, y) { cbind(1,x,y,x^2,y^2,x*y) %*% coef(model) }

# predicted values in form that persp() can use
z <- outer(x, y, f)

# 3d plot of surface with persp()
ele_3d <- persp(x=x,y=y,z=z, theta=40, phi=15, zlim=c(min(arv$elevation), max(arv$elevation)) )

# transform observed values into 2d space
elevation_points <- trans3d(arv$axis_x, arv$axis_y, arv$elevation, pmat=ele_3d)

# plot observed values
points(elevation_points)

# add dotted lines from surface to observed values
fit_vals <- trans3d(arv$axis_x, arv$axis_y, fitted(model), pmat = ele_3d)
segments(fit_vals$x, fit_vals$y, elevation_points$x, elevation_points$y, lty = 3)

另一种选择是在格中使用带有wireframe() 的面板函数。见this post

【讨论】:

  • 我赞成保留意见。这是对“如何绘图”的具体问题的一个很好的回答,但是在lm() 调用中使用I() 函数可能会让新手相信这是构建用于统计分析的线性模型的正确方法多项式模型......但事实并非如此。
  • @DWin 对lm() 的调用反映了 OP 的代码块。会使用poly(),但更愿意让代码与 OP 保持一致。
  • 只是为新手发布警告。正如我所说,我认为您的回答是正确的,但只是对“正确”的狭义解释。不可概括。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多