R使用Plot3D包绘制透明长方体3D网格并叠加到scatter3D散点图咨询
实现方案
plot3D 包没有内置的透明长方体网格绘制函数,但可以通过polygon3D()手动封装实现,完全支持叠加到scatter3D()生成的散点图上,具体实现步骤和可运行代码如下:
核心思路
- 先绘制基础3D散点图作为底图
- 封装单个透明长方体的绘制函数,支持自定义大小、颜色、透明度
- 遍历所有网格单元,调用自定义函数叠加到散点底图上
可运行示例代码
library(plot3D) # 自定义绘制单个透明长方体的函数 draw_cube <- function(xmin, xmax, ymin, ymax, zmin, zmax, col = "gray", alpha = 0.2, add = TRUE) { # 前面(z=zmax) polygon3D( x = c(xmin, xmax, xmax, xmin), y = c(ymin, ymin, ymax, ymax), z = rep(zmax, 4), col = col, alpha = alpha, border = "black", lwd = 0.5, add = add ) # 后面(z=zmin) polygon3D( x = c(xmin, xmax, xmax, xmin), y = c(ymin, ymin, ymax, ymax), z = rep(zmin, 4), col = col, alpha = alpha, border = "black", lwd = 0.5, add = TRUE ) # 左面(x=xmin) polygon3D( x = rep(xmin, 4), y = c(ymin, ymax, ymax, ymin), z = c(zmin, zmin, zmax, zmax), col = col, alpha = alpha, border = "black", lwd = 0.5, add = TRUE ) # 右面(x=xmax) polygon3D( x = rep(xmax, 4), y = c(ymin, ymax, ymax, ymin), z = c(zmin, zmin, zmax, zmax), col = col, alpha = alpha, border = "black", lwd = 0.5, add = TRUE ) # 底面(y=ymin) polygon3D( x = c(xmin, xmax, xmax, xmin), y = rep(ymin, 4), z = c(zmin, zmin, zmax, zmax), col = col, alpha = alpha, border = "black", lwd = 0.5, add = TRUE ) # 顶面(y=ymax) polygon3D( x = c(xmin, xmax, xmax, xmin), y = rep(ymax, 4), z = c(zmin, zmin, zmax, zmax), col = col, alpha = alpha, border = "black", lwd = 0.5, add = TRUE ) } # 1. 生成示例散点数据 set.seed(123) x <- runif(50, 0, 3) y <- runif(50, 0, 3) z <- runif(50, 0, 3) # 2. 绘制基础3D散点图 scatter3D(x, y, z, col = "red", pch = 16, cex = 1.2, xlab = "X轴", ylab = "Y轴", zlab = "Z轴", xlim = c(0,3), ylim = c(0,3), zlim = c(0,3), ticktype = "detailed") # 3. 叠加3x3x3的透明网格 for (i in 0:2) { for (j in 0:2) { for (k in 0:2) { draw_cube( xmin = i, xmax = i+1, ymin = j, ymax = j+1, zmin = k, zmax = k+1, col = "lightblue", alpha = 0.2 ) } } }
优化建议
- 网格数量较大时,可以将填充色
col设为NA,只保留边框,渲染速度提升明显 - 透明度
alpha建议设置在0.1-0.3区间,兼顾网格辨识度和散点可读性 - 不同网格单元可自定义填充色,比如根据单元内散点数量匹配对应的颜色值
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

