Home > Back-end >  rgl: plot3d with "extended" plotting symbols
rgl: plot3d with "extended" plotting symbols

Time:02-28

I am trying to extend the symbols available to me for plotting in 3D. In 2D, I use:

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)

In 2D, my plot works and gives the appropriate symbol:

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

and the plot is here:example 2D plot with appropriate symbols

In 3D, however, the symbols do not get translated correctly.

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

this yields: enter image description here

The symbols are getting replaced with (one) circle.

I also tried with pch3d and got blank plots. However, pch3d does work with the "standard" plotting symbols.

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

I get the plot: 3D plot with standard symbols

So, it appears to be that at least the symbols are not displaying in 3D. How can I display the preferred symbols?

CodePudding user response:

I was able to only get a solution using text3d() -- hopefully there exists a better solution.

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()

This yields the figure:

Using text3d

This may well be too complicated, hopefully there are better solutions out there.

CodePudding user response:

This is the best I could do:

3d picture with crowns

Set up file for 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()

Load package, define a function to plot the texture at a random point:

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()
  •  Tags:  
  • r rgl
  • Related