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

如何在R的交互式/静态3D散点图中添加拟合回归线?

我来帮你搞定3D散点图加回归线的需求!针对你的问题,我会从你正在使用的car包入手,再推荐几个更灵活的交互式/静态绘图方案:

一、用car包直接添加拟合平面与回归线

你用的car::scatter3d其实自带了模型拟合可视化的功能,之前你设置了surface=FALSE关掉了拟合平面,只要调整参数就能同时展示散点、拟合平面,还有单个自变量与因变量的边际回归线。

直接修改你的代码即可:

library(car)
data(iris)

# 拟合多元线性模型
f <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = iris)

# 绘制带拟合平面和回归线的3D散点图
scatter3d(x = Sepal.Length, y = Sepal.Width, z = Petal.Length, 
          data = iris,
          point.col = "blue", 
          fit = f,  # 传入你拟合好的模型
          surface = TRUE,  # 显示拟合平面
          regression.line = TRUE)  # 显示每个自变量与因变量的边际回归线

运行后你会看到:蓝色散点、浅灰色的拟合平面,还有红色的边际回归线(分别展示Sepal.Width/Petal.Length与Sepal.Length的线性关系,在3D空间中投影)。

二、用plotly实现更灵活的交互式3D图

如果你想要更流畅的交互体验(比如自由旋转、缩放、切换图层),plotly是非常好的选择,它可以轻松添加拟合平面和自定义回归线:

library(plotly)
data(iris)

# 拟合模型
f <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = iris)

# 生成拟合平面的网格数据
grid <- expand.grid(
  Sepal.Width = seq(min(iris$Sepal.Width), max(iris$Sepal.Width), length.out = 20),
  Petal.Length = seq(min(iris$Petal.Length), max(iris$Petal.Length), length.out = 20)
)
grid$Sepal.Length_pred <- predict(f, newdata = grid)

# 绘制交互式3D散点+拟合平面+回归线
p <- plot_ly(iris, 
             x = ~Sepal.Length, 
             y = ~Sepal.Width, 
             z = ~Petal.Length,
             type = "scatter3d", 
             mode = "markers",
             marker = list(color = "blue", size = 4),
             name = "原始数据") %>%
  # 添加半透明拟合平面
  add_surface(x = ~unique(grid$Sepal.Length_pred), 
              y = ~unique(grid$Sepal.Width), 
              z = ~unique(grid$Petal.Length),
              opacity = 0.5,
              colorscale = list(c(0,1), c("lightgray", "lightgray")),
              name = "拟合平面") %>%
  # 添加固定Petal.Length均值时的回归线
  add_trace(x = ~predict(f, newdata = data.frame(Sepal.Width = iris$Sepal.Width, Petal.Length = mean(iris$Petal.Length))),
            y = ~Sepal.Width,
            z = rep(mean(iris$Petal.Length), nrow(iris)),
            type = "scatter3d",
            mode = "lines",
            line = list(color = "red", width = 3),
            name = "Sepal.Width 回归线") %>%
  # 添加固定Sepal.Width均值时的回归线
  add_trace(x = ~predict(f, newdata = data.frame(Sepal.Width = mean(iris$Sepal.Width), Petal.Length = iris$Petal.Length)),
            y = rep(mean(iris$Sepal.Width), nrow(iris)),
            z = ~Petal.Length,
            type = "scatter3d",
            mode = "lines",
            line = list(color = "green", width = 3),
            name = "Petal.Length 回归线") %>%
  layout(scene = list(
    xaxis = list(title = "Sepal.Length"),
    yaxis = list(title = "Sepal.Width"),
    zaxis = list(title = "Petal.Length")
  ))

# 显示交互式图
p

这个图支持鼠标拖拽旋转、滚轮缩放,还能点击图例隐藏/显示特定图层,交互体验拉满。

三、用rgl包实现轻量3D可视化

如果需要轻量级的3D绘图(支持交互式操作,也能导出静态图),可以试试rgl包:

library(rgl)
data(iris)

# 拟合模型
f <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = iris)

# 打开3D绘图设备
open3d()

# 绘制原始散点
points3d(iris$Sepal.Length, iris$Sepal.Width, iris$Petal.Length, col = "blue", size = 2)

# 生成拟合平面的网格数据
y_grid <- seq(min(iris$Sepal.Width), max(iris$Sepal.Width), length.out = 20)
z_grid <- seq(min(iris$Petal.Length), max(iris$Petal.Length), length.out = 20)
x_pred <- outer(y_grid, z_grid, function(y,z) predict(f, newdata = data.frame(Sepal.Width = y, Petal.Length = z)))

# 绘制半透明拟合平面
surface3d(x_pred, y_grid, z_grid, alpha = 0.5, color = "lightgray")

# 添加固定Petal.Length均值的回归线
pred1 <- predict(f, newdata = data.frame(Sepal.Width = iris$Sepal.Width, Petal.Length = mean(iris$Petal.Length)))
lines3d(pred1, iris$Sepal.Width, rep(mean(iris$Petal.Length), nrow(iris)), col = "red", lwd = 3)

# 添加固定Sepal.Width均值的回归线
pred2 <- predict(f, newdata = data.frame(Sepal.Width = mean(iris$Sepal.Width), Petal.Length = iris$Petal.Length))
lines3d(pred2, rep(mean(iris$Sepal.Width), nrow(iris)), iris$Petal.Length, col = "green", lwd = 3)

# 添加坐标轴标签
axes3d()
title3d(xlab = "Sepal.Length", ylab = "Sepal.Width", zlab = "Petal.Length")

你可以用鼠标拖拽旋转视图,关闭窗口后可以用rgl.snapshot()保存为静态图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:46:30