r - 将 3D 表面拟合到点数据集 [R]

我一直在尝试将多项式曲面拟合到一组具有 3 个坐标的点。

让数据为:

DATA <- with(mtcars, as.data.frame(cbind(1:32, wt,disp,mpg)))

我一直在尝试使用以下方法绘制曲面:

  1. plot3d 来自 rgl 包,
  2. 使用 rsm 包,
  3. scatterplot3d 包。

例如:

library(scatterplot3d)
attach(mtcars)
DATA <- as.data.frame(cbind(1:32, wt,disp,mpg))
scatterplot3d(wt,disp,mpg, main="3D Scatterplot")
model <- loess(mpg ~wt + disp, data=DATA)
x <-range(DATA$wt)
x <- seq(x[1], x[2], length.out=50)    
y <- range(DATA$disp)
y <- seq(y[1], y[2], length.out=50)
z <- outer(x,y, 
       function(wt,disp)
         predict(model, data.frame(wt,disp)))
z
p <- persp(x,y,z, theta=30, phi=30, 
       col="lightblue",expand = 0.5,shade = 0.2,
       xlab="wt", ylab="disp", zlab="mpg")

我也尝试过使用 surf.ls 函数:

surf.ls(2,DATA[,2],DATA[,3],DATA[,4])

但我得到的是这样的: 我真的不知道如何将其转换为 3D 图,更重要的是,如何获得最佳拟合曲面的公式。

非常感谢您的帮助。

PS 我已经删除了我的上一篇文章,并在这篇文章中包含了更多细节。

最佳答案

试试这个:

attach(mtcars)
DATA <- as.data.frame(cbind(1:32, wt,disp,mpg))

x_wt <- DATA$wt
y_disp <- DATA$disp
z_mpg <- DATA$mpg

fit <- lm(z_mpg ~ poly(x_wt, y_disp, degree = 2), data = DATA)

要使用 rsm 绘图,请使用以下命令:

library(rsm)
image(fit, y_disp ~ x_wt)
contour(fit, y_disp ~ x_wt)
persp(fit, y_disp ~ x_wt, zlab = "z_mpg")

要使用 ggplot 绘图,请使用以下命令:

## ggplot
# Use rsm package to create surface model.
library(rsm)
SurfMod <- contour(fit, y_disp ~ x_wt)

# extract list values from rsm Surface Model 
Xvals <- SurfMod$`x_wt ~ y_disp`[1]
Yvals <- SurfMod$`x_wt ~ y_disp`[2]
Zvals <- SurfMod$`x_wt ~ y_disp`[3]

# Construct matrix with col and row names 
SurfMatrix <- Zvals$z
colnames(SurfMatrix) <- Yvals$y
rownames(SurfMatrix) <- Xvals$x

# Convert matrix to data frame
library(reshape2)
SurfDF <- melt(SurfMatrix)

library(ggplot2)
gg <- ggplot(data = SurfDF) +
      geom_tile(data = SurfDF, aes(Var1, Var2,z = value, fill = value)) +
      stat_contour(data = SurfDF, aes(Var1, Var2, z = value, color = ..level..)) +
      scale_colour_gradient(low = "green", high = "red") +
      geom_point(data = DATA, aes(wt, disp, z = mpg, color = mpg)) +
      geom_text(data = DATA, aes(wt, disp,label=mpg),hjust=0, vjust=0) +
      scale_fill_continuous(name="mpg") +
      xlab("x_wt") +
      ylab("y_disp")
library(directlabels)
direct.label.ggplot(gg, "angled.endpoints")

要查看所有可用的 direct.label 方法,请转到 http://directlabels.r-forge.r-project.org/docs/index.html

https://stackoverflow.com/questions/33848918/

相关文章:

rx-java - 将热 Observable 转换为冷 Observable

cordova - react 路由器和 Cordova 不工作

caching - 查找处理器的多级缓存的 AMAT 和 CPI

java - 当新阶段弹出时,我如何禁用初级阶段

r - R中的钟形百分位曲线

css - 输入内的响应式 fa-icon

arrays - 将数组附加到数组

c# - 还有其他更好的方法可以将参数传递给 backgroundworker runasync 吗

python - 如何在python中为字符串添加前缀和后缀

verilog - systemverilog 中逻辑语句的非常量索引