rgl: plot3d with "extended" 绘图符号

rgl: plot3d with "extended" plotting symbols

我正在尝试扩展可用于 3D 绘图的符号。在 2D 中,我使用:

x1 <- sort(rnorm(10))
y1 <- rnorm(10)
z1 <- rnorm(10) + atan2(x1, y1)
x2 <- sort(rnorm(10))
y2 <- rnorm(10)
z2 <- rnorm(10) + atan2(x2, y2)
x3 <- sort(rnorm(10))
y3 <- rnorm(10)
z3 <- rnorm(10) + atan2(x3, y3)
new.styles <- -1*c(9818:9824, 9829, 9830, 9831)

在 2D 中,我的情节有效并给出了适当的符号:

plot(x1, y1, col="red", bg="red", pch=new.styles, cex = 2)

剧情在这里:

但是,在 3D 中,符号无法正确翻译。

rgl::plot3d(x1, y1, z1, col="red", bg="red", pch=new.styles, size = 10)

这产生:

符号被(一个)圆圈取代。

我也尝试过使用 pch3d 并得到空白图。但是,pch3d 确实可以使用“标准”绘图符号。

 rgl::pch3d(x1, y1, z1, col="red", bg="red", pch=10:19, size = 10)

我明白了情节:

所以,看起来至少符号没有以 3D 方式显示。如何显示首选符号?

这是我能做的最好的了:

为 texture/shape 设置文件:

crown <- tempfile(pattern = "crown", fileext = ".png")
png(filename = crown)
plot(1,1, ann=FALSE, axes=FALSE, pch=-9818, cex = 40, col = 2)
dev.off()

加载包,定义一个随机点绘制纹理的函数:

library(rgl)
xyz <- cbind(c(0,1,1,0), 0, c(0,0,1,1))
add_quad_point <- function(shape = crown, sd = 3) {
  pos <- rnorm(3, sd = sd)
  m <- sweep(xyz, MARGIN=2, STATS = pos, FUN = "+")
  quads3d(m,
          texture = shape,
          texcoords = xyz[,c(1,3)],
          col = "white",
          specular = "black")
}
open3d()
replicate(10, add_quad_point())
axes3d()
## close3d()

我只能使用 text3d() 获得解决方案 -- 希望有更好的解决方案。

x1 <- sort(rnorm(12))
y1 <- rnorm(12)
z1 <- rnorm(12) + atan2(x1, y1)
x2 <- sort(rnorm(12))
y2 <- rnorm(12)
z2 <- rnorm(12) + atan2(x2, y2)
x3 <- sort(rnorm(12))
y3 <- rnorm(12)
z3 <- rnorm(12) + atan2(x3, y3)
new.styles <- c(9818:9824, 9829, 9830, 9831, 9832, 9827)

rgl::open3d()
pal.col <- RColorBrewer::brewer.pal(name = "Paired", n = 12)                                        
for (i in 1:12)
    rgl::text3d(x1[i], y1[i], z1[i], col=pal.col[i], text = intToUtf8(new.styles[i]), cex = 2, usePlotmath = TRUE)
rgl::box3d()

这产生了数字:

这可能太复杂了,希望有更好的解决方案。