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

如何在R语言中绘制3D曲面图?附数据集示例

常用R包及3D曲面图实现方法

当然有专门的R包可以实现3D曲面图,以下是几个实用工具包的具体操作方案,假设你已有x、y向量,需先构建网格并拟合对应的z值(曲面图需要x-y网格匹配的z数据,散点数据需先通过建模生成曲面预测值):

1. rgl包(交互式3D绘图)

适合生成可拖拽旋转的交互式3D曲面,操作步骤:

  • 安装加载包:
install.packages("rgl")
library(rgl)
  • 数据处理与绘图示例:
# 替换成你的x、y数据,这里用模拟数据演示
x <- rnorm(100)
y <- rnorm(100)
z <- x^2 + y^2 + rnorm(100, 0, 0.1)  # 模拟z值,实际场景可通过建模生成

# 创建x-y网格
grid_x <- seq(min(x), max(x), length.out = 50)
grid_y <- seq(min(y), max(y), length.out = 50)
grid <- expand.grid(x = grid_x, y = grid_y)

# 用局部回归拟合曲面
fit <- loess(z ~ x + y, data = data.frame(x, y, z))
grid$z <- predict(fit, newdata = grid)

# 绘制曲面
persp3d(grid$x, grid$y, grid$z, col = "lightblue", xlab = "X", ylab = "Y", zlab = "Z")
# 可选:叠加原始散点
points3d(x, y, z, col = "red", size = 2)

2. plotly包(Web交互式可视化)

生成的曲面图支持在线交互缩放、旋转,适合分享:

  • 安装加载包:
install.packages("plotly")
library(plotly)
  • 数据处理与绘图示例:
# 延续模拟数据,替换为你的真实数据即可
grid_x <- seq(min(x), max(x), length.out = 50)
grid_y <- seq(min(y), max(y), length.out = 50)
grid <- expand.grid(x = grid_x, y = grid_y)
fit <- loess(z ~ x + y, data = data.frame(x, y, z))
grid$z <- predict(fit, newdata = grid)

# 转换为plotly要求的矩阵格式
z_matrix <- matrix(grid$z, nrow = length(grid_x), ncol = length(grid_y))

# 绘制曲面+散点
plot_ly(x = grid_x, y = grid_y, z = z_matrix, type = "surface", colorscale = "Viridis") %>%
  add_markers(x = x, y = y, z = z, marker = list(color = "red", size = 3)) %>%
  layout(scene = list(xaxis = list(title = "X"), yaxis = list(title = "Y"), zaxis = list(title = "Z")))

3. lattice包(静态出版级绘图)

适合生成高精度静态3D曲面图,用于论文或报告:

  • 安装加载包:
install.packages("lattice")
library(lattice)
  • 数据处理与绘图示例:
# 延续模拟数据
grid_x <- seq(min(x), max(x), length.out = 50)
grid_y <- seq(min(y), max(y), length.out = 50)
grid <- expand.grid(x = grid_x, y = grid_y)
fit <- loess(z ~ x + y, data = data.frame(x, y, z))
grid$z <- predict(fit, newdata = grid)

# 绘制带阴影的曲面
wireframe(z ~ x * y, data = grid, col = "lightgreen", xlab = "X", ylab = "Y", zlab = "Z",
          shade = TRUE, aspect = c(1, 1))

# 可选:叠加原始散点
wireframe(z ~ x * y, data = grid, col = "lightgreen", shade = TRUE,
          panel = function(x, y, z, ...) {
            panel.wireframe(x, y, z, ...)
            panel.points3d(x = x, y = y, z = z, col = "red", pch = 16)
          })

关键提示

  • 3D曲面图必须要有x-y网格对应的z值,如果你的原始数据只有x、y(无z),需先明确z的定义:比如z是x-y组合的密度、频数,或是通过回归/机器学习模型生成的预测值。
  • 示例用了loess局部回归拟合曲面,你可根据数据特点替换为线性模型(lm)、广义可加模型(gam)等。

内容的提问来源于stack exchange,提问作者PersianK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:44:49