如何在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
相关产品推荐
相关产品推荐

