Put a fixed title in an interactive 3D plot using rgl package, R
Asked Answered
S

4

10

I am trying to add a fixed title to an interactive 3d plot using the rgl package from R, but so far I haven't been able to do it. I also would like to have one main title and a subtitle under the main title.

Here is a sample code,

library(rgl)

data<-read.table(text="          X         Y         Z
                 1  147.0883 -18.69122 -13.90000
                 2  147.0894 -18.69455 -10.97250
                 3  147.0883 -18.69122 -17.45000
                 4  147.0883 -18.69122 -15.44000
                 5  147.0883 -18.69122 -13.45000
                 6  147.0909 -18.69922 -12.25000
                 7  147.0883 -18.69122 -17.30000
                 8  147.0883 -18.69122 -16.40000
                 9  147.0883 -18.69122 -14.30000
                 10 147.0883 -18.69122 -18.50000
                 11 147.0883 -18.69122 -15.67606
                 12 147.0883 -18.69122 -17.25780
                 13 147.0883 -18.69122  -3.64000
                 14 147.1164 -18.68133 -22.13000
                 15 147.0883 -18.69122 -18.54778
                 16 147.0883 -18.69122 -15.50000
                 17 147.1185 -18.68691 -14.55500
                 18 147.0883 -18.69122 -18.12500
                 19 147.0901 -18.69670 -14.39767",header=T)

data

a<-as.matrix(data)

# call the plug-in bandwidth estimator 
H.pi<-Hpi(a,binned=TRUE)*3 ## a is a matrix of x,y,z points 

# calculate the kernel densities 
fhat<-kde(a,H=H.pi)

# produce a 3D plot
open3d()

title<-"Individual 1 (male)" # main title
title2<-"Site A" # subtitle

plot(fhat,cont=c(50,95),colors=c("green","red"),drawpoints=TRUE,
     xlab="",ylab="", zlab="",size=1.5,ptcol="black", 
     axes=F,box=T,aspect=c(1,1,0.5),zlim=c(-40,0))

axes3d(c("x--","y--","z-+"),cex=0.8)
mtext3d("Longitude",edge="x--",line=3,las=2,cex=1.1)
mtext3d("Latitude",edge="y--",line=3,las=2,cex=1.1)
mtext3d("Depth (m)",edge="z-+",line=3,las=2,cex=1.1)

title3d(main=title,sub=title2,line=4)

I haven't found a good way of having a fixed title (and subtitle) so that when I export my plot as a 3D movie, the main title is not rotating with the plot...

movie3d(spin3d(axis=c(0,0,1), rpm=4),dir="~/Dropbox/R/Sample plots", duration=15, fps=10, movie="Plot 1")

If you have a good/easy way of putting the main title in a fixed location (and possibly adding a secondary title under) that will be great. Thanks in advance,

Sharp answered 21/7, 2013 at 23:49 Comment(1)
I think what you want is not possible with rgl. You might consider adding the title after you create the movie using some other software.Grommet
T
2

This cannot be done in rgl at present.

Tem answered 26/8, 2013 at 11:3 Comment(2)
Is there a way to have at least the main title at a fixed location in the background while the plot is moving?Sharp
No - ?rgl.texts says the text is positioned in 3d space, facing the user. The rgl graphics device doesn't use the standard R plotting system so text won't work, title won't work etc. I think it just needs some work at the C++ level to implement 2d static text using the ftgl library that rgl uses for its text.Tem
O
16

Putting a title in a RGL plot is now possible, thanks to an update dating from last year.

The idea is to use the new function bgplot3d which outputs to the background of the RGL window, as if it was a normal plot.

For example:

# A minimal plot3d example
library(rgl)
a = matrix(runif(3000), ncol=3)
plot3d(a, col = rainbow(100)[cut(a[,1], breaks = seq(0,1,le=101), include.lowest = T)])

bgplot3d({
  plot.new()
  title(main = 'This is the main title', line = 3)
  mtext(side = 1, 'This is a subtitle', line = 4)
  # use here any other way you fancy to write your title
})

Which gives:

                                                RGL title with plot3d and bgplot3d

There is one pretty important caveat though, stated as a note in the help page for bgplot3d:

Because the background plots are drawn as bitmaps, they do not resize very gracefully. It's best to size your window first, then draw the background at that size.

Orgasm answered 29/10, 2015 at 21:46 Comment(0)
T
2

This cannot be done in rgl at present.

Tem answered 26/8, 2013 at 11:3 Comment(2)
Is there a way to have at least the main title at a fixed location in the background while the plot is moving?Sharp
No - ?rgl.texts says the text is positioned in 3d space, facing the user. The rgl graphics device doesn't use the standard R plotting system so text won't work, title won't work etc. I think it just needs some work at the C++ level to implement 2d static text using the ftgl library that rgl uses for its text.Tem
A
1

To reproduce your script kde is missing (a library not included) ... in any case Did you consider using:adding after the movie:

text3d(x=0.08, y=0.97, z=0.03, title.main ,col="Blue")

where: x,y,z are locations in your graphic. I have use this together with scatter3d (using also using rgl).

Attaway answered 7/9, 2014 at 15:19 Comment(0)
A
1

Similar to the suggestion about test, you can add a legend that stays stationary and use it as your title. See example below from Adding a legend to an rgl 3d plot

legend3d("topright", legend = paste('Type', c('A', 'B', 'C')), pch = 16, col = rainbow(3), cex=1, inset=c(0.02))
Antiperistalsis answered 10/6, 2015 at 20:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.