使用wireframe绘制钻石数据集3D曲面图异常问题求助
解决wireframe绘制3D平滑曲面异常的问题
问题原因
直接用diamonds原始散点数据绘制wireframe时,因为数据是非规则网格的离散点,wireframe会尝试连接所有原始数据点,而非生成平滑曲面,这就导致了图中出现大量竖线的异常情况。要绘制带多项式平滑的3D曲面,必须先拟合模型并生成规则网格上的预测值,再用这些预测值绘图。
解决方案步骤
- 生成覆盖
carat和depth取值范围的规则网格数据 - 拟合包含
carat*depth多项式交互项的回归模型 - 用模型预测网格上的
price值 - 基于预测结果绘制
wireframe曲面
完整代码示例
# 加载所需包 library(lattice) library(ggplot2) # 1. 创建规则网格数据 # 获取carat和depth的取值范围并生成序列 carat_seq <- seq(min(diamonds$carat), max(diamonds$carat), length.out = 50) depth_seq <- seq(min(diamonds$depth), max(diamonds$depth), length.out = 50) grid_data <- expand.grid(carat = carat_seq, depth = depth_seq) # 2. 拟合多项式交互模型(这里用2次多项式,可按需调整次数) model <- lm(price ~ poly(carat, 2) * poly(depth, 2), data = diamonds) # 3. 预测网格上的price值 grid_data$pred_price <- predict(model, newdata = grid_data) # 4. 绘制wireframe平滑曲面 wf <- wireframe(pred_price ~ carat * depth, data = grid_data, shade = TRUE, zlab = "Price", xlab = "Carat", ylab = "Depth", scales = list(arrows = FALSE), drape = TRUE, colorkey = TRUE) wf
代码说明
- 规则网格的
length.out参数控制曲面精细度,数值越大曲面越平滑,但计算量会相应增加 - 多项式次数可通过修改
poly()函数的第二个参数调整,比如改成3次多项式poly(carat, 3) * poly(depth, 3) drape = TRUE和colorkey = TRUE可添加颜色映射,更直观展示price的变化趋势
内容的提问来源于stack exchange,提问作者amy
相关产品推荐
相关产品推荐

