You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于分组数据点生成平滑曲面?3D可视化技术求助

三维平滑曲面可视化解决方案

我之前也碰到过类似的棘手问题,给你几个经过验证的方案,既能实现平滑曲面拟合,又能轻松保存可视化结果:

方案1:用plotly实现交互式三维平滑曲面

plotly的交互性很强,生成平滑曲面的逻辑清晰,还能直接导出图片或HTML文件。核心思路是先拟合一个支持二维预测变量的平滑模型(比如广义相加模型GAM),再基于模型生成曲面网格数据,最后叠加原始散点和拟合曲面:

# 加载所需包
library(plotly)
library(mgcv)

# 模拟示例数据(替换成你的真实数据即可)
set.seed(123)
n <- 200
var1 <- rnorm(n)
var2 <- rnorm(n)
value <- 2*sin(var1) + 0.5*var2^2 + rnorm(n, 0, 0.3)
df <- data.frame(var1, var2, value)

# 拟合GAM平滑模型,捕捉var1和var2的非线性关系
gam_model <- gam(value ~ s(var1) + s(var2) + ti(var1, var2), data = df)

# 生成绘制曲面用的网格数据
var1_seq <- seq(min(df$var1), max(df$var1), length.out = 50)
var2_seq <- seq(min(df$var2), max(df$var2), length.out = 50)
grid_df <- expand.grid(var1 = var1_seq, var2 = var2_seq)
grid_df$pred_value <- predict(gam_model, newdata = grid_df)

# 绘制交互式三维图:原始散点+平滑曲面
p <- plot_ly() %>%
  add_markers(data = df, x = ~var1, y = ~var2, z = ~value, 
              color = ~value, opacity = 0.6, name = "原始数据") %>%
  add_surface(data = grid_df, x = ~var1, y = ~var2, z = ~pred_value, 
              opacity = 0.7, name = "平滑曲面") %>%
  layout(scene = list(xaxis = list(title = "var1"),
                      yaxis = list(title = "var2"),
                      zaxis = list(title = "value")))

# 保存结果:支持HTML交互文件或静态图片
htmlwidgets::saveWidget(p, "3d_smooth_plot.html")
# 或者用plotly内置截图功能导出图片
plotly::export(p, "3d_smooth_plot.png")

这个方案的优势是可以拖拽旋转视角,全方位观察三维关系,保存也很方便。

方案2:用rgl实现静态/交互式三维平滑曲面

如果之前用rgl报错,大概率是曲面数据格式不对(比如没把预测值转成矩阵),试试这个流程:

library(rgl)
library(mgcv)

# 复用上面的示例数据和GAM模型
# ...(数据模拟和模型拟合步骤同上)

# 初始化rgl绘图窗口
open3d()
# 绘制原始数据散点
points3d(df$var1, df$var2, df$value, col = "blue", size = 2)
# 绘制平滑曲面:注意要把预测值转成矩阵格式
surface3d(var1_seq, var2_seq, matrix(grid_df$pred_value, nrow = 50), 
          col = "lightgreen", alpha = 0.6)
# 添加坐标轴标签
axes3d()
title3d(xlab = "var1", ylab = "var2", zlab = "value")

# 保存为静态图片
rgl.snapshot("rgl_3d_plot.png")
# 或者保存为交互式HTML文件
rglwidget() %>% htmlwidgets::saveWidget("rgl_3d_plot.html")

方案3:用plot3D实现静态三维平滑曲面

plot3D语法直观,只要正确准备网格数据就不会报错,适合生成静态科研图:

library(plot3D)
library(mgcv)

# 复用上面的示例数据和GAM模型
# ...(数据模拟和模型拟合步骤同上)

# 绘制散点+平滑曲面
scatter3D(df$var1, df$var2, df$value, pch = 16, col = "blue", 
          xlab = "var1", ylab = "var2", zlab = "value",
          surf = list(x = var1_seq, y = var2_seq, z = matrix(grid_df$pred_value, 50), 
                      col = "lightgreen", alpha = 0.6))

# 保存静态图片
dev.print(png, "plot3D_3d_plot.png", width = 800, height = 600)

以上三个方案都能满足「三维关系可视化+平滑曲面拟合+保存绘图」的需求,你可以根据自己的使用场景偏好选择~

内容的提问来源于stack exchange,提问作者jay.sf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:52:43