如何在rgl包中使用球体以外的点形状绘制3D投影点?
在rgl中为3D点设置自定义形状实现投影可视化
我想用rgl展示10³立方体顶点的3D形态及其2D投影,以此解释投影概念。2D绘图中已用4种颜色(红、蓝、深绿、棕)和4种pch形状(正方形、圆形、三角形、菱形)区分顶点,但在rgl的3D绘图里,使用type="s"时pch参数无效,只能显示球体,希望替换成立方体、球体、金字塔、菱形这类3D形状。
现有代码
生成立方体顶点及投影数据
vals <- c(0, 10) X <- expand.grid(x1 = vals, x2=vals, x3=vals) |> as.matrix() # 正交投影到x1-x2平面 P1 <- rbind(diag(2), c(0,0)) Y1 <- X %*% P1 # 斜投影 P2 <- matrix(c(0.71, 0.71, 0, -0.42, .42, 0.84), ncol=2) Y2 <- X %*% P2
2D绘图代码
pch <- rep(15:18, 2) colors <- c("red", "blue", "darkgreen", "brown") col <- rep(colors, each = 2) plot(Y1, cex = 3, pch = pch, col = col, xlab = "Y[,1]", ylab = "Y[,2]", xlim = c(-1, 11), ylim = c(-1, 11)) plot(Y2, cex = 3, pch = pch, col = col, xlab = "Y[,1]", ylab = "Y[,2]", xlim = c(-1, 15), ylim = c(-5, 14) )
尝试的rgl代码(仅能显示球体)
library(rgl) open3d() plot3d(X, type = "s", size = 2, pch = pch, col = col)
解决方案
rgl的plot3d()函数中,type="s"仅支持球体,pch参数在此模式下不生效。要实现自定义3D形状,需要逐个顶点绘制对应的3D几何体,利用rgl提供的cube3d()、sphere3d()、tetrahedron3d()(金字塔)、octahedron3d()(近似菱形的3D形状)等函数,结合循环为每个顶点匹配对应形状。
实现代码
library(rgl) # 定义pch到3D形状的映射 shape_map <- list( 15 = cube3d(), # 对应2D的正方形 16 = sphere3d(), # 对应2D的圆形 17 = tetrahedron3d(),# 对应2D的三角形(金字塔) 18 = octahedron3d() # 对应2D的菱形(八面体) ) open3d() # 循环每个顶点,绘制对应形状 for (i in 1:nrow(X)) { # 获取当前点的形状、颜色和位置 shape <- shape_map[[as.character(pch[i])]] # 缩放形状大小,调整位置,设置颜色 shade3d(translate3d(scale3d(shape, 0.8, 0.8, 0.8), X[i,1], X[i,2], X[i,3]), col = col[i]) } # 添加坐标轴标签 axes3d() title3d(xlab = "x1", ylab = "x2", zlab = "x3")
关键说明
scale3d():调整3D形状的大小,避免过大遮挡其他顶点;translate3d():将形状移动到对应顶点的坐标位置;shade3d():渲染带填充颜色的3D形状;- 可根据需求替换
shape_map中的几何体,比如icosahedron3d()等其他rgl支持的3D模型。
内容的提问来源于stack exchange,提问作者user101089
相关产品推荐
相关产品推荐

