R语言使用rgl包绘制指定对角点三维范围盒的问题解决
R中使用rgl绘制指定对角顶点的三维生态位盒
问题原因
rgl包自带的printBox3d()(即你调用的printBox())参数逻辑并非接收两个对角顶点坐标:该函数前三个入参为三维盒的中心点坐标,后三个入参为三维盒在x、y、z轴上的总边长,因此会出现以第一个点为中心向正负双向延伸的效果,不符合预期。
可行实现代码
你可以通过转换rgl内置的立方体图元,直接生成以(x1,y1,z1)为最小角、(x2,y2,z2)为最大角的轴对齐三维盒,代码如下:
# 坐标轴整体范围 x <- c(31.94, 9460.00) y <- c(28, 14375) z <- c(0.02, 95.11) # 三维盒的两个对角顶点坐标 x1 <- 42.69 y1 <- 4 z1 <- 0.03 x2 <- 3686.996 y2 <- 1997.317 z2 <- 5.156709 # 加载包、初始化绘图窗口 library(rgl) open3d() # 绘制坐标轴,type="n"表示仅生成坐标系不绘制原始散点 plot3d(x, y, z, xlab = "EC 1:5 [mS/cm]", ylab = "Na [mg/kg]", # 修正原代码括号不匹配的笔误 zlab = "SAR", type = "n") # 生成立方体图元:默认是中心在原点、各轴范围为[-1,1]的单位立方体 niche_box <- cube3d() # 缩放立方体到目标区间的尺寸 niche_box <- scale3d(niche_box, x = (x2 - x1)/2, y = (y2 - y1)/2, z = (z2 - z1)/2) # 平移立方体到目标坐标位置 box_center <- c((x1 + x2)/2, (y1 + y2)/2, (z1 + z2)/2) niche_box <- translate3d(niche_box, x = box_center[1], y = box_center[2], z = box_center[3]) # 绘制半透明填充的盒体 shade3d(niche_box, col = "#2c7fb8", alpha = 0.3, add = TRUE) # 绘制盒体黑色边框 wire3d(niche_box, col = "black", lwd = 2, add = TRUE)
可选:调用printBox3d实现的写法
如果要继续使用printBox3d函数,只需按其参数规则传入中心点和各轴边长即可:
printBox3d(x = box_center[1], y = box_center[2], z = box_center[3], dx = x2 - x1, dy = y2 - y1, dz = z2 - z1, fill = "#2c7fb8", col = "black", alpha = 0.3)
参数调整说明
- 可修改
shade3d中的col参数调整盒体填充色,alpha参数调整填充透明度(取值0-1,越小越透明) - 可修改
wire3d中的lwd参数调整边框线粗细 - 如果需要保留
plot3d初始绘制的坐标轴范围端点散点,去掉type = "n"参数即可
内容的提问来源于stack exchange,提问作者Ricarda
相关产品推荐
相关产品推荐

